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边形呵呵

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

#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);
}

最新文章

  1. ThreadLocal类的实现用法
  2. C++ STL初学笔记
  3. GLSL实现HDR Rendering 【转】
  4. BZOJ1272: [BeiJingWc2008]Gate Of Babylon
  5. Objective-C异步编程
  6. ESP8266固件修改可以控制多个IO方法
  7. github basic usage in windows
  8. glib实践篇:父类与子类
  9. 适配器模式(Adpater Pattern)
  10. webpack3中使用postcss-loader和autoprefixer给css3样式添加浏览器兼容
  11. Python--day10(函数(使用、分类、返回值))
  12. .net core 2.x - ids4 - identity - two factory 登录认证
  13. 动态规划——Frog Jump
  14. 原生js实现淘宝图片切换
  15. intellij idea 程序包不可见问题
  16. 2018-2019-2 20175126谢文航 实验二《Java面向对象程序设计》实验报告
  17. 唯一约束(UNIQUE_KEY)
  18. js基础学习
  19. SCRUM 12.03
  20. rsync推送备份服务器(Linux)

热门文章

  1. [高并发]抢红包设计(使用redis)
  2. 蓝桥杯 0/1背包问题 (java)
  3. UE4 保存为bitmap
  4. 记node前后端代码共用的一次坑
  5. [field:softlinks/]逻辑过程
  6. 前端自动化构建工具Gulp简单入门
  7. servlet入门学习之生命周期
  8. visual studio 中无法删除项目或者文件
  9. Windows脚本相关
  10. 无废话XML--DOM4J