1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. using namespace std;
  6. const double eps = 1e-6;
  7. const int inf = 0x3f3f3f3f;
  8.  
  9. int n,m;
  10. int f[100];
  11. struct point{
  12. double x,y;
  13. point(double xx = 0,double yy = 0){
  14. this->x = xx;
  15. this->y = yy;
  16. }
  17. void read(){
  18. scanf("%lf%lf",&x,&y);
  19. }
  20. }p[100];
  21. struct Q{
  22. int l,r,c;
  23. }q[1005];
  24. bool judge(point pp,point p1,point p2){///向量叉积。推断顺逆时针时注意三个点的先后位置
  25. /// <0是就是第一个向量在第二个向量的逆时针方向;
  26. return ((p1.x-pp.x)*(p2.y-pp.y)-(p2.x-pp.x)*(p1.y - pp.y)) < -eps;
  27. }
  28. Q tra(point t,int c){
  29. Q ans;
  30. bool flag[100];
  31. memset(flag,false,sizeof(flag));
  32. for(int i = 0; i < n; i++){
  33. if(judge(t,p[i],p[i+1])){///推断能不能照到这条边
  34. ///(实际上推断转化成了照到点);
  35. flag[i] = true;
  36. }
  37. }
  38. ///以下是处理得出的数据,保存下每一个灯所能照到的最左端和最右端;
  39. if(flag[n-1]&&flag[0]){
  40. int left = n-1;
  41. while(flag[left-1]){left--;}
  42. int right = 0;
  43. while(flag[right+1]){right++;}
  44. ans.l = left;
  45. ans.r = right + n;
  46. }
  47. else{
  48. int left = 0,right = n-1;
  49. while(!flag[left]){left++;}
  50. while(!flag[right]){right--;}
  51. ans.l = left;
  52. ans.r = right;
  53. }
  54. ans.c = c;
  55. return ans;
  56. }
  57. bool solve()
  58. {
  59. int ans = inf;
  60. for(int i = 0; i < n; i++){
  61. memset(f,inf,sizeof(f));
  62. f[i] = 0;
  63. for(int j = 0; j < n; j++){
  64. int r = i + j;///从第i个点開始往后数了j个;
  65. ///多定义这么一个层次,能够使状态的转移变得有序
  66. for(int k = 0; k < m; k++){
  67. if(q[k].l > r) continue;///当前点与该灯照亮的最左点之间有空隔,就不符合開始更新的条件;
  68. if(q[k].r < r) continue;///这是个剪枝,去掉也对;就是不再考虑不会成为最优解的情况;
  69. int now = min(q[k].r + 1, i + n);///依据区间右端点往后更新。可是一旦更新过了i+n就要将端点定为i+n;
  70. f[now] = min(f[now],f[r] + q[k].c);
  71. }
  72. }
  73. ans = min(ans,f[i+n]);
  74. }
  75. if(ans == inf) return false;
  76. printf("%d\n",ans);
  77. return true;
  78. }
  79. int main()
  80. {
  81. while(scanf("%d",&n) != EOF){
  82. if(n == 0) break;
  83. for(int i = 0; i < n; i++){
  84. p[i].read();
  85. }
  86. p[n] = p[0];
  87.  
  88. scanf("%d",&m);
  89. point temp;int c;
  90. for(int i = 0; i < m; i++){
  91. temp.read();
  92. scanf("%d",&c);
  93. q[i] = tra(temp,c);
  94. }
  95.  
  96. if(!solve()) printf("Impossible.\n");
  97. }
  98. return 0;
  99. }

uva 10641 (来当雷锋的这回....)的更多相关文章

  1. UVA 10739 String to Palindrome(动态规划 回文)

    String to Palindrome 题目大意:给出一个字符串s,现在可以进行3种操作(添加字母,删除字母,替换字母),将其变成回文串,求出最少的操作次数.比如abccda,可以用删除操作,删除b ...

  2. UVA 11584 Paritioning by Palindromes(动态规划 回文)

    题目大意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串.比如racecar本身就是回文串:fastcar只能分成7个单字母的回文串:aaadbccb最少可分成3个回文串:aaa. ...

  3. UVA 12378 Ball Blasting Game 【Manacher回文串】

    Ball Blasting Game Morteza is playing a ball blasting game. In this game there is a chain of differe ...

  4. uva 10716 Evil Straw Warts Live(贪心回文串)

    这道题目我用了一上午才做出来,还是看的别人的思路,尽管没有看代码做的有点慢.代码能力还是得加强啊.思维 得缜密.不能想当然,要有根据,写上的代码要有精确度.省的以后还得慢慢调试 思路:贪心.每次都查看 ...

  5. UVA 10641 - Barisal Stadium(DP + 几何)

    题目链接:10641 - Barisal Stadium 题意:逆时针给定n个点,在给m个灯,每一个灯有一个花费,要求最小花费使得全部边能被灯照到 思路:用向量叉积推断向量的顺逆时针关系,从而预处理出 ...

  6. 【Uva 10641】 Barisal Stadium

    [Link]: [Description] 输入一个凸n(3≤n≤30)边形体育馆和多边形外的m(1≤m≤1000)个点光源,每个点光 源都有一个费用值.选择一组点光源,照亮整个多边形,使得费用值总和 ...

  7. Uva 11584,划分成回文串

    题目链接:https://uva.onlinejudge.org/external/115/11584.pdf 题意: 一个字符串,将它划分一下,使得每个串都是回文串,求最少的回文串个数. 分析: d ...

  8. UVA - 11584 划分字符串的回文串子串; 简单dp

    /** 链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34398 UVA - 11584 划分字符串的回文串子串: 简单 ...

  9. uva 10453 【回文串区间dp】

    Uva 10453 题意:给定字符串,问最少插入多少个字符使其变成回文串,并任意输出一种结果. 题解:和Uva 10739类似,这里是只能增加.类似定义dp[i][j]表示子串Si...Sj变为回文串 ...

随机推荐

  1. nyoj-647-奋斗小蜗牛在请客(进制转换)

    奋斗小蜗牛在请客 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 一路艰辛一路收获.成功爬过金字塔的小蜗牛别提多高兴了.这不为了向以前帮助他的哥们们表达谢意,蜗牛宴请 ...

  2. 菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t

    菜鸟nginx源代码剖析数据结构篇(九) 内存池ngx_pool_t Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.csdn ...

  3. 朴素贝叶斯python实现

    概率论是非常多机器学习算法基础,朴素贝叶斯分类器之所以称为朴素,是由于整个形式化过程中仅仅做最原始.简单的如果. (这个如果:问题中有非常多特征,我们简单如果一个个特征是独立的.该如果称做条件独立性, ...

  4. hdoj--3367--Pseudoforest(伪森林&&最大生成树)

    Pseudoforest Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To ...

  5. centos7 usually use

    firewall-cmd --permanent --add-rich-rule 'rule family=ipv4 source address=192.168.22.103 port port=8 ...

  6. 洛谷P3356 火星探险问题(费用流)

    题目描述 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车.登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动.探测车在移动中还必须采集岩石标本.每一块岩石标本由最先遇到它的探测 ...

  7. Linux学习日记——字符处理

    (菜鸡学习日记 各种使用命令只列举了常用几种,发现错误望指正) 一.管道 在Linux 中,管道就是一个固定大小的缓冲区,大小为一页4K.它是一种通信的机制,可以使用管道符“ | ” 来连接进程,连接 ...

  8. 动画view

    1:view动画 @1:xml中 alph:渐变透明度动画效果 scale:渐变尺寸伸缩动画效果 translate:画面转换位置移动动画效果 rootate:画面转移旋转动画效果 @2:JavaCo ...

  9. Windos下的6种IO模型简要介绍

    windows进行数据的收发有6种IO模型.分别是阻塞(blocking)模型,选择(select)模型,异步选择(WSAAsyncSelect)模型,事件选择(WSAEventSelect )模型, ...

  10. SQL Server 检测到基于一致性的逻辑 I/O 错误

    背景:新建DB_GZN 恢复数据库备份文件 执行:          select * from VI_MPS_PAPLT 错误提示: 消息 824,级别 24,状态 2,第 2 行 SQL Serv ...