BZOJ 1069: [SCOI2007]最大土地面积 [旋转卡壳]
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
0 0
1 0
1 1
0 1
0.5 0.5
Sample Output
HINT
数据范围 n<=2000, |x|,|y|<=100000
4边形呵呵
枚举对角线,就是两个三角形啊....并且还是两个点确定的...卡就行了
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- using namespace std;
- typedef long long ll;
- const int N=;
- const double eps=1e-;
- inline int sgn(double x){
- if(abs(x)<eps) return ;
- else return x<?-:;
- }
- struct Vector{
- double x,y;
- Vector(double a=,double b=):x(a),y(b){}
- bool operator <(const Vector &a)const{
- return sgn(x-a.x)<||(sgn(x-a.x)==&&sgn(y-a.y)<);
- }
- };
- typedef Vector Point;
- Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
- Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
- Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
- Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
- bool operator ==(Vector a,Vector b){return sgn(a.x-b.x)==&&sgn(a.y-b.y)==;}
- double Dot(Vector a,Vector b){return a.x*b.x+a.y*b.y;}
- double Cross(Vector a,Vector b){return a.x*b.y-a.y*b.x;}
- double Len(Vector a){return sqrt(Dot(a,a));}
- double Len2(Vector a){return Dot(a,a);}
- double DisTL(Point p,Point a,Point b){
- Vector v1=p-a,v2=b-a;
- return abs(Cross(v1,v2)/Len(v2));
- }
- int ConvexHull(Point p[],int n,Point ch[]){
- sort(p+,p++n);
- int m=;
- for(int i=;i<=n;i++){
- while(m>&&sgn(Cross(ch[m]-ch[m-],p[i]-ch[m-]))<=) m--;
- ch[++m]=p[i];
- }
- int k=m;
- for(int i=n-;i>=;i--){
- while(m>k&&sgn(Cross(ch[m]-ch[m-],p[i]-ch[m-]))<=) m--;
- ch[++m]=p[i];
- }
- if(n>) m--;
- return m;
- }
- double S(Vector a,Vector b){return abs(Cross(a,b));}
- double RotatingCalipers(Point p[],int n){
- if(n<) return ;
- if(n==) return abs(Cross(p[]-p[],p[]-p[]))/+abs(Cross(p[]-p[],p[]-p[]))/;
- double ans=;
- p[n+]=p[];
- for(int i=;i<=n-;i++){
- int k=i+,l=(i+)%n+;
- for(int j=i+;j<=n;j++){
- while(k+<j&&sgn(S(p[k]-p[i],p[j]-p[i])-S(p[k+]-p[i],p[j]-p[i]))<) k=k+;
- 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+;
- ans=max(ans,S(p[k]-p[i],p[j]-p[i])/+S(p[l]-p[i],p[j]-p[i])/);
- }
- }
- return ans;
- }
- int n;
- Point p[N],ch[N];
- int main(int argc, const char * argv[]) {
- scanf("%d",&n);
- for(int i=;i<=n;i++) scanf("%lf%lf",&p[i].x,&p[i].y);
- n=ConvexHull(p,n,ch);
- double ans=RotatingCalipers(ch,n);
- printf("%.3f",ans);
- }
BZOJ 1069: [SCOI2007]最大土地面积 [旋转卡壳]的更多相关文章
- BZOJ 1069: [SCOI2007]最大土地面积(旋转卡壳)
题目链接~ 1069: [SCOI2007]最大土地面积 思路很简单,极角排序求完凸包后,在凸包上枚举对角线,然后两边分别来两个点旋转卡壳一下,搞定! 不过计算几何的题目就是这样,程序中间的处理还是比 ...
- bzoj 1069 [SCOI2007]最大土地面积——旋转卡壳
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1069 发现 n 可以 n^2 .所以枚举对角线,分开的两部分三角形就可以旋转卡壳了. 注意坐 ...
- 1069: [SCOI2007]最大土地面积|旋转卡壳
旋转卡壳就是先求出凸包.然后在凸包上枚举四边形的对角线两側分别找面积最大的三角形 因为在两側找面积最大的三角形的顶点是单调的所以复杂度就是n2 单调的这个性质能够自行绘图感受一下,似乎比較显然 #in ...
- bzoj 1069 [SCOI2007]最大土地面积(旋转卡壳)
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2277 Solved: 853[Submit][Stat ...
- bzoj1069 [SCOI2007]最大土地面积 旋转卡壳
1069: [SCOI2007]最大土地面积 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3767 Solved: 1501[Submit][Sta ...
- bzoj 1069: [SCOI2007]最大土地面积 凸包+旋转卡壳
题目大意: 二维平面有N个点,选择其中的任意四个点使这四个点围成的多边形面积最大 题解: 很容易发现这四个点一定在凸包上 所以我们枚举一条边再旋转卡壳确定另外的两个点即可 旋(xuan2)转(zhua ...
- ●BZOJ 1069 [SCOI2007]最大土地面积
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1069 题解: 计算几何,凸包,旋转卡壳 其实和这个题差不多,POJ 2079 Triangl ...
- [BZOJ]1069: [SCOI2007]最大土地面积
题目大意:给出二维平面上n个点,求最大的由这些点组成的四边形面积.(n<=2000) 思路:求出凸包后旋转卡壳枚举对踵点对作为四边形的对角线,枚举或二分另外两个点,复杂度O(n^2)或O(nlo ...
- BZOJ 1069 [SCOI2007]最大土地面积 ——计算几何
枚举对角线,然后旋转卡壳即可. #include <map> #include <cmath> #include <queue> #include <cstd ...
随机推荐
- JS使用循环按指定倍数分割数组组成新的数组的方法
今天一个新人同事问了我一个问题,就是有一个像下边这种不知道具体长度的数组,想以每4个为一组,重新组合为一个二维数组,很简单的需求只需要用到一个循环再去取余数就可以了,写了一个小demo在这里把代码包括 ...
- Docker+Jenkins持续集成环境(4):使用etcd+confd实现容器服务注册与发现
前面我们已经通过jenkins+docker搭建了基本的持续集成环境,实现了服务的自动构建和部署,但是,我们遇到一个问题,jenkins构建出来的镜像部署后,需要通过ip:port去访问,有什么更好的 ...
- 语义化版本控制规范(SemVer)
摘自: http://semver.org/lang/zh-CN/ 简介 在软件管理的领域里存在着被称作"依赖地狱"的死亡之谷,系统规模越大,加入的套件越多,你就越有可能在未来的某 ...
- phpstudy中的mysql
1.进入mysql命令台,执行 select version()即可 2status;
- action之间传参为中文;type='redirect'和 type='redirectAction'主要区别
摘录自:http://blog.csdn.net/lhi705/article/details/7446156 Struts2中action之间传参中文乱码的问题 解决方法一(已经验证,可以): 两个 ...
- html静态页面乱码
1.将文件保存为UTF-8 2.写入以下代码 <!-- 防止中文乱码 --><meta http-equiv="Content-Type" content=&qu ...
- struts学习总结
-- struts2 是在struts1和webwork基础上发展的全新框架. -- struts2解决的问题: 原始的servlet中,每需要操作一个crud的操作就要创建一个servlet,虽然后 ...
- 5dfda1332b67817b0f2d7839242021ce'Java数据结构和算法
1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...
- mybatis实战教程三:多对多关联
MyBatis3.0 添加了association和collection标签专门用于对多个相关实体类数据进行级联查询,但仍不支持多个相关实体类数据的级联保存和级联删除操作 一.创建student.te ...
- 一、Html简介
html什么东西呢? hypertext markup language(超文本标记语言).超级文本标记语言是标准通用标记语言下的一个应用,也是一种规范,一种标准, 它通过标记符号来标记要显示的网页中 ...