nyoj952最大四边形
2015-09-26 23:58
302 查看
最大四边形
时间限制:1000 ms | 内存限制:65535 KB难度:2
描述平面坐标上有n个点,你知道能组成四边形中面积最大的是多少吗?
输入
有多组测试数据
第一行整数n,表示有n个点,( 4<=n<=300 )
然后n行,每行x,y表示点的坐标。(没有重复的点)
输出
最大四边形的面积.(保留六位小数)
样例输入
5 0 0 0 4 4 0 4 4 2 3
样例输出
16.000000
解题思路:枚举每条线段作为四边形的对角线然后计算线段左边最大面积直线右端最大面积相加即可
#include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #define eps 1e-10 using namespace std; struct point{ double x,y; }A[310]; int sgn(double n){ if(fabs(n)<eps)return 0; if(n<0)return -1; return 1; } double cp(point p1,point p2,point p3){ return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } double MAX(double a,double b){ return a>b?a:b; } int main() { int n,i,j,k; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;++i){ scanf("%lf%lf",&A[i].x,&A[i].y); } double ans=0; for(i=0;i<n;++i){ for(j=i+1;j<n;++j){//枚举边 double S,Sa=0,Sb=0; for(k=0;k<n;++k){//枚举每一个点 if(k==i||k==j)continue; double S=0.5*cp(A[i],A[j],A[k]); if(sgn(S)<0)Sa=MAX(Sa,-S); else Sb=MAX(Sb,S); } if(Sa==0||Sb==0)continue; //不能四边形 ans=MAX(ans,Sa+Sb); } } printf("%.6lf\n",ans); } return 0; }
相关文章推荐
- USACO 1.5 Checker Challenge (DFS)
- mysql取系统当前时间的函数
- android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类). 用xUtils会出现问题
- Boost ASIO攻破!!!(★firecat推荐★)
- 矩阵多维数组笔试题
- C++11中的std::function
- 启动另一个Activity
- Java复选框JCheckBox和单选按钮JRadioButton用法详解
- iOS7极限编程 第一部分 第二章 世界是扁平化的:新的UI范式 (译)
- 2003域控升级为2008域控步骤。
- SNMP简单网络管理协议
- hdu(5477)——A Sweet Journey
- 辞职二战一个月感想
- 快乐的sublime编辑器(笔记)
- /usr/bin/cd 是什么鬼
- 在哪下载XCode dmg安装文件
- uva 11210 Chinese Mahjong 中国麻将 dfs回溯
- Google Java编程风格指南
- 【JAVA】数字相加
- 布局