1069: [SCOI2007]最大土地面积

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 2978  Solved: 1173
[Submit][Status][Discuss]

Description

  在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成
的多边形面积最大。

Input

  第1行一个正整数N,接下来N行,每行2个数x,y,表示该点的横坐标和纵坐标。

Output

  最大的多边形面积,答案精确到小数点后3位。

Sample Input

5
0 0
1 0
1 1
0 1
0.5 0.5

Sample Output

1.000

HINT

数据范围 n<=2000, |x|,|y|<=100000


4边形呵呵

枚举对角线,就是两个三角形啊....并且还是两个点确定的...卡就行了

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <vector>
  7. using namespace std;
  8. typedef long long ll;
  9. const int N=;
  10. const double eps=1e-;
  11.  
  12. inline int sgn(double x){
  13. if(abs(x)<eps) return ;
  14. else return x<?-:;
  15. }
  16.  
  17. struct Vector{
  18. double x,y;
  19. Vector(double a=,double b=):x(a),y(b){}
  20. bool operator <(const Vector &a)const{
  21. return sgn(x-a.x)<||(sgn(x-a.x)==&&sgn(y-a.y)<);
  22. }
  23. };
  24. typedef Vector Point;
  25. Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
  26. Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
  27. Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
  28. Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
  29. bool operator ==(Vector a,Vector b){return sgn(a.x-b.x)==&&sgn(a.y-b.y)==;}
  30. double Dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
  31. double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
  32.  
  33. double Len(Vector a){return sqrt(Dot(a,a));}
  34. double Len2(Vector a){return Dot(a,a);}
  35. double DisTL(Point p,Point a,Point b){
  36. Vector v1=p-a,v2=b-a;
  37. return abs(Cross(v1,v2)/Len(v2));
  38. }
  39. int ConvexHull(Point p[],int n,Point ch[]){
  40. sort(p+,p++n);
  41. int m=;
  42. for(int i=;i<=n;i++){
  43. while(m>&&sgn(Cross(ch[m]-ch[m-],p[i]-ch[m-]))<=) m--;
  44. ch[++m]=p[i];
  45. }
  46. int k=m;
  47. for(int i=n-;i>=;i--){
  48. while(m>k&&sgn(Cross(ch[m]-ch[m-],p[i]-ch[m-]))<=) m--;
  49. ch[++m]=p[i];
  50. }
  51. if(n>) m--;
  52. return m;
  53. }
  54. double S(Vector a,Vector b){return abs(Cross(a,b));}
  55. double RotatingCalipers(Point p[],int n){
  56. if(n<) return ;
  57. if(n==) return abs(Cross(p[]-p[],p[]-p[]))/+abs(Cross(p[]-p[],p[]-p[]))/;
  58. double ans=;
  59. p[n+]=p[];
  60. for(int i=;i<=n-;i++){
  61. int k=i+,l=(i+)%n+;
  62. for(int j=i+;j<=n;j++){
  63. while(k+<j&&sgn(S(p[k]-p[i],p[j]-p[i])-S(p[k+]-p[i],p[j]-p[i]))<) k=k+;
  64. while(l%n+!=i&&sgn(S(p[l]-p[i],p[j]-p[i])-S(p[l%n+]-p[i],p[j]-p[i]))<) l=l%n+;
  65. ans=max(ans,S(p[k]-p[i],p[j]-p[i])/+S(p[l]-p[i],p[j]-p[i])/);
  66. }
  67. }
  68. return ans;
  69. }
  70.  
  71. int n;
  72. Point p[N],ch[N];
  73. int main(int argc, const char * argv[]) {
  74. scanf("%d",&n);
  75. for(int i=;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
  76. n=ConvexHull(p,n,ch);
  77. double ans=RotatingCalipers(ch,n);
  78. printf("%.3f",ans);
  79. }

BZOJ 1069: [SCOI2007]最大土地面积 [旋转卡壳]的更多相关文章

  1. BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)

    题目链接~ 1069: [SCOI2007]最大土地面积 思路很简单,极角排序求完凸包后,在凸包上枚举对角线,然后两边分别来两个点旋转卡壳一下,搞定! 不过计算几何的题目就是这样,程序中间的处理还是比 ...

  2. bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1069 发现 n 可以 n^2 .所以枚举对角线,分开的两部分三角形就可以旋转卡壳了. 注意坐 ...

  3. 1069: [SCOI2007]最大土地面积|旋转卡壳

    旋转卡壳就是先求出凸包.然后在凸包上枚举四边形的对角线两側分别找面积最大的三角形 因为在两側找面积最大的三角形的顶点是单调的所以复杂度就是n2 单调的这个性质能够自行绘图感受一下,似乎比較显然 #in ...

  4. bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 2277  Solved: 853[Submit][Stat ...

  5. bzoj1069 [SCOI2007]最大土地面积 旋转卡壳

    1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 3767  Solved: 1501[Submit][Sta ...

  6. bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳

    题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...

  7. ●BZOJ 1069 [SCOI2007]最大土地面积

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1069 题解: 计算几何,凸包,旋转卡壳 其实和这个题差不多,POJ 2079 Triangl ...

  8. [BZOJ]1069: [SCOI2007]最大土地面积

    题目大意:给出二维平面上n个点,求最大的由这些点组成的四边形面积.(n<=2000) 思路:求出凸包后旋转卡壳枚举对踵点对作为四边形的对角线,枚举或二分另外两个点,复杂度O(n^2)或O(nlo ...

  9. BZOJ 1069 [SCOI2007]最大土地面积 ——计算几何

    枚举对角线,然后旋转卡壳即可. #include <map> #include <cmath> #include <queue> #include <cstd ...

随机推荐

  1. JS使用循环按指定倍数分割数组组成新的数组的方法

    今天一个新人同事问了我一个问题,就是有一个像下边这种不知道具体长度的数组,想以每4个为一组,重新组合为一个二维数组,很简单的需求只需要用到一个循环再去取余数就可以了,写了一个小demo在这里把代码包括 ...

  2. Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现

    前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...

  3. 语义化版本控制规范(SemVer)

    摘自: http://semver.org/lang/zh-CN/ 简介 在软件管理的领域里存在着被称作"依赖地狱"的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在未来的某 ...

  4. phpstudy中的mysql

    1.进入mysql命令台,执行 select version()即可 2status;

  5. action之间传参为中文;type='redirect'和 type='redirectAction'主要区别

    摘录自:http://blog.csdn.net/lhi705/article/details/7446156 Struts2中action之间传参中文乱码的问题 解决方法一(已经验证,可以): 两个 ...

  6. html静态页面乱码

    1.将文件保存为UTF-8 2.写入以下代码 <!-- 防止中文乱码 --><meta http-equiv="Content-Type" content=&qu ...

  7. struts学习总结

    -- struts2 是在struts1和webwork基础上发展的全新框架. -- struts2解决的问题: 原始的servlet中,每需要操作一个crud的操作就要创建一个servlet,虽然后 ...

  8. 5dfda1332b67817b0f2d7839242021ce'Java数据结构和算法

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  9. mybatis实战教程三:多对多关联

    MyBatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作 一.创建student.te ...

  10. 一、Html简介

    html什么东西呢? hypertext markup language(超文本标记语言).超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中 ...