思路来自于:http://www.cnblogs.com/wuyiqi/archive/2011/11/06/2238530.html

枚举两个多边形的两个点组成的直线,判断能与几个多边形相交

因为最佳的直线肯定可以经过某两个点(可以平移到顶点处),所以暴力枚举两个点就好了

如果有模版的话,写代码就快多了。

代码如下:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <string>
  6. #include <cmath>
  7. #include <queue>
  8. #include <stack>
  9. #include <vector>
  10. #include <map>
  11.  
  12. #define LL long long
  13. #define eps 1e-8
  14. #define N 15
  15. #define K 15
  16.  
  17. using namespace std;
  18.  
  19. struct Point{
  20. double x, y;
  21. Point operator - (const Point &t) const
  22. {
  23. Point temp;
  24. temp.x = x-t.x;
  25. temp.y = y-t.y;
  26. return temp;
  27. }
  28. Point operator + (const Point &t) const
  29. {
  30. Point temp;
  31. temp.x = x+t.x;
  32. temp.y = y+t.y;
  33. return temp;
  34. }
  35. bool operator == (const Point &t) const
  36. {
  37. return fabs(x-t.x)<eps&&fabs(y-t.y)<eps;
  38. }
  39. };
  40. struct Figure{
  41. int cnt;
  42. Point poi[K];
  43. };
  44. struct Line{
  45. double a, b, c;
  46. };
  47. Figure fig[N];
  48. Line t_Line(Point a, Point b)//点到直线的转化
  49. {
  50. Line temp;
  51. temp.a = a.y-b.y;
  52. temp.b = b.x-a.x;
  53. temp.c = a.x*b.y-b.x*a.y;
  54. return temp;
  55. }
  56. bool Line_Inst(Line l1, Line l2, Point &p)//判断直线相交,并求交点
  57. {
  58. double a1 = l1.a, b1 = l1.b, c1 = l1.c;
  59. double a2 = l2.a, b2 = l2.b, c2 = l2.c;
  60. if(fabs(a1*b2-a2*b1)<eps) return false;
  61. p.x = (b1*c2-b2*c1)/(a1*b2-a2*b1);
  62. p.y = (a1*c2-a2*c1)/(a2*b1-a1*b2);
  63. return true;
  64. }
  65. double cross(Point a, Point b, Point c)//求向量的叉积,判断三点是否共线
  66. {
  67. return (b.x-c.x)*(a.y-c.y)-(b.y-c.y)*(a.x-c.x);
  68. }
  69. bool dotOnSeg(Point a, Point b, Point c)//判断点是否在线段上
  70. {
  71. if(a==c||b==c) return true;
  72. return cross(a,b,c)<eps&&
  73. (b.x-c.x)*(a.x-c.x)<eps&&
  74. (b.y-c.y)*(a.y-c.y)<eps;
  75. }
  76. int main ()
  77. {
  78. int t, n, k, kk = 0;
  79. scanf("%d", &t);
  80. while(t--)
  81. {
  82. scanf("%d", &n);
  83. for(int i = 1; i <= n; ++i)
  84. {
  85. scanf("%d", &k);
  86. fig[i].cnt = k;
  87. for(int j = 1; j <= k; ++j)
  88. scanf("%lf %lf", &fig[i].poi[j].x, &fig[i].poi[j].y);
  89. }
  90. if(n<=2)
  91. {
  92. printf("Case %d: %d\n",++kk, n);
  93. continue;
  94. }
  95. int ans = 0;
  96. Point p;
  97. for(int i = 1; i <= n; ++i)
  98. for(int j = i+1; j <= n; ++j)
  99. for(int k = 1; k <= fig[i].cnt; ++k)
  100. for(int l = 1; l <= fig[j].cnt; ++l)
  101. {
  102. Line l1 = t_Line(fig[i].poi[k], fig[j].poi[l]);//找到经过两个图形的顶点的直线
  103. int tt = 2;
  104. for(int ii = 1; ii <= n; ++ii)
  105. {
  106. if(ii==i||ii==j) continue;
  107. for(int jj = 1; jj < fig[ii].cnt; ++jj)
  108. {
  109. Line l2 = t_Line(fig[ii].poi[jj], fig[ii].poi[jj+1]);//图形的两个相邻节点组成一条直线
  110. if(Line_Inst(l1,l2,p)&&dotOnSeg(fig[ii].poi[jj], fig[ii].poi[jj+1], p))
  111. {//直线相交,并且交点位于线段上,即可证明直线l1穿过线段
  112. ++tt;
  113. break;
  114. }
  115. }
  116. }
  117. ans = max(ans, tt);
  118. }
  119. printf("Case %d: %d\n",++kk, ans);
  120. }
  121. return 0;
  122. }

hdu - 3952 Fruit Ninja(简单几何)的更多相关文章

  1. hdu 4000 Fruit Ninja 树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4000 Recently, dobby is addicted in the Fruit Ninja. ...

  2. hdu 4620 Fruit Ninja Extreme

    Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. HDU 4620 Fruit Ninja Extreme 搜索

    搜索+最优性剪枝. DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个.没想清楚,TLE到死…… #include ...

  4. HDU 4116 Fruit Ninja

    http://acm.hdu.edu.cn/showproblem.php?pid=4116 题意:给N个圆,求一条直线最多能经过几个圆?(相切也算) 思路:枚举中心圆,将其他圆的切线按照极角排序,并 ...

  5. HDU 4000 Fruit Ninja 树状数组 + 计数

    给你N的一个排列,求满足:a[i] < a[k] < a[j] 并且i < j < k的三元组有多少个. 一步转化: 求出所有满足 a[i] < a[k] < a[ ...

  6. HDU 4620 Fruit Ninja Extreme(2013多校第二场 剪枝搜索)

    这题官方结题报告一直在强调不难,只要注意剪枝就行. 这题剪枝就是生命....没有最优化剪枝就跪了:如果当前连续切割数加上剩余的所有切割数没有现存的最优解多的话,不需要继续搜索了 #include &l ...

  7. hdu 4620 Fruit Ninja Extreme(状压+dfs剪枝)

    对t进行从小到大排序(要记录ID),然后直接dfs. 剪枝的话,利用A*的思想,假设之后的全部连击也不能得到更优解. 因为要回溯,而且由于每次cut 的数目不会超过10,所以需要回溯的下标可以利用一个 ...

  8. HDU 4620 Fruit Ninja Extreme 暴搜

    题目大意:题目就是描述的水果忍者. N表示以下共有 N种切水果的方式. M表示有M个水果需要你切. W表示两次连续连击之间最大的间隔时间. 然后下N行描述的是 N种切发 第一个数字C表示这种切法可以切 ...

  9. HDU 4000 Fruit Ninja (树状数组+反向思维)

    题意:给你一串数且每个数都不同,问你(x,y,z)出现 x<z<y 的总次数 首先我们直接想的话不能使用O(n*log2 n)解决,所以可以正难则反 可以求得x<(y,z)的值,减去 ...

随机推荐

  1. underscorejs

    Underscore是一个JavaScript实用库,提供了一整套函数式编程的实用功能,但是没有扩展任何JavaScript内置对象.它是这个问题的答案:“如果我在一个空白的HTML页面前坐下, 并希 ...

  2. 精妙SQL语句

    asc 按升序排列desc 按降序排列 下列语句部分是Mssql语句,不可以在access中使用.SQL分类: DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE) DML—数据 ...

  3. Swift中的Optional类型 (可选类型)与强制解包 ? !

    我们在swift的开发中会经常遇见?和! ,理解这两个符号深层次的内容对我们的开发是相当有利的: 目前网上对swift3.0的教程还相当的少,如果去搜索会发现早期的说法,在定义变量的时候,swift是 ...

  4. 浅析Linux下的/etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc文件

    转自:http://www.ahlinux.com/shell/20239.html 0x01 /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/e ...

  5. iOS 调用拍照、选择本地相册、上传功能---未完善。

    1.新建viewController 拖入一个Button,添加点击事件,使用代理方法 <UIActionSheetDelegate,UIImagePickerControllerDelegat ...

  6. 在IIS6上部署MVC站点,Nhiernate数据库底层

    服务器环境要求: Windows 2003 server + IIS6.0 1.必须安装.net framework 4.0, MVC 2.最好能安装.net framework 的sp1, 我们服务 ...

  7. delegate事件绑定

    为了代码的健壮性,绑定事件之前先解绑再进行绑定. var _$div = $("#id");_$div.undelegate("click mouseover mouse ...

  8. MySQL_财务统计各产品品类各城市上周收入毛利表_20161202

    注:财务需要统计各产品品类各城市上周毛利情况 下面这样的表是沟通后展现的形式.数据展现形式我认为的大都是行列转 列转行的转置 从财务角度这样展现形式比较适合. 由于黄色部分为汇总项目,因此我拆分成9个 ...

  9. PHP性能优化简述

    先谢慕课网,这里只做理论简述/** * PHP性能优化 * * 1.问题分析 * PHP语法使用不正确 * PHP不擅长的事 * PHP连接的服务不给力 * PHP自身短板 * 其它原因 * 2.PH ...

  10. NetBios 的结构体详解(网络控制块NCB)

    对之前网络基础编程用到控制块NCB进行介绍(补充): 在Win32环境下,使用VC++6.0进行NetBIOS程序开发时, 需要用到nb30.h文件和netapi32.lib静态链接库.前者定义了Ne ...