hdu 5533 Dancing Stars on Me 2015ACM/ICPC亚洲区长春站-重现赛
2016-06-17 08:44
281 查看
先判断是否为凸包,然后将(0->n-1)的长度与(1->0->n-1)的角度作为基准,遍历比较即可。
#include<iostream> #include<stdio.h> #include<cstdio> #include<string> #include<cmath> #include<stdlib.h> #include<algorithm> #include<string.h> #include<cstring> #include<vector> #include<queue> #include<map> using namespace std; //hdu 5533 const int maxn=110; const double eps=1e-9; int T; int n; int ans; pair<double,double>point[maxn]; bool cmp(pair<double,double>a,pair<double,double>b) { if(a.first==b.first) { return a.second<b.second; } return a.first<b.first; } int Cross(pair<double,double>a,pair<double,double>b) { return a.first*b.second-a.second*b.first; } pair<double,double>sub(pair<double,double>a,pair<double,double>b) { return make_pair(a.first-b.first,a.second-b.second); } int ConvexHull() { pair<double,double>ch[maxn]; memset(ch,0,sizeof(ch)); int m=0; for(int i=0;i<n;i++) { while(m>1&&Cross(sub(ch[m-1],ch[m-2]),sub(point[i],ch[m-2]))<0) m--; ch[m++]=point[i]; } int k=m; for(int i=n-2;i>=0;i--) { while(m>k&&Cross(sub(ch[m-1],ch[m-2]),sub(point[i],ch[m-2]))<0) m--; ch[m++]=point[i]; } if(n>1) m--; for(int i=0;i<m;i++) point[i]=ch[i]; return m; } double Dot(pair<double,double>a,pair<double,double>b) { return a.first*b.first+a.second*b.second; } double Length(pair<double,double>a) { return sqrt(Dot(a,a)); } double Angle(pair<double,double>a,pair<double,double>b) { return acos(Dot(a,b)/Length(a)/Length(b)); } int main() { freopen("input.txt","r",stdin); scanf("%d",&T); for(int ca=1;ca<=T;ca++) { memset(point,0,sizeof(point)); ans=1; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf %lf",&point[i].first,&point[i].second); } sort(point,point+n,cmp); //for(int i=0;i<n;i++) cout<<point[i].first<<" "<<point[i].second<<endl; if(ConvexHull()<n) { ans=0; } else { double baselen=Length(make_pair(point[n-1].first-point[0].first,point[n-1].second-point[0].second)); for(int i=1;i<n;i++) { //pair<double,double>vec1=make_pair(point[i-1].first-point[i-2].first,point[i-1].second-point[i-2].second); pair<double,double>vec2=make_pair(point[i].first-point[i-1].first,point[i].second-point[i-1].second); //cout<<i<<" "<<Length(vec2)<<" "<<baselen<<endl; if(abs(Length(vec2)-baselen)>eps) { ans=0; break; } } double baseang=Angle(make_pair(point[1].first-point[0].first,point[1].second-point[0].second),make_pair(point[n-1].first-point[0].first,point[n-1].second-point[0].second)); for(int i=2;i<n;i++) { pair<double,double>vec1=make_pair(point[i-1].first-point[i-2].first,point[i-1].second-point[i-2].second); pair<double,double>vec2=make_pair(point[i].first-point[i-1].first,point[i].second-point[i-1].second); if(abs(Angle(vec1,vec2)-baseang)>eps) { ans=0; break; } } } if(ans==0) printf("NO\n"); else printf("YES\n"); } return 0; }
相关文章推荐
- html——加入代码
- 使用Maven进行测试
- 运算符,表达式
- HTML5 data-* 自定义属性
- 开源新闻速递:Snapd 2.0.8 发布
- 软件可靠性方法 学习笔记
- html——<address>标签,为网页加入地址信息
- Eclipse 中文注释乱码解决方案
- Maven下载及安装配置
- 6C - Alice, Bob and Chocolate
- 用AOM对象模式,实现QTP的远程调用
- C# 值类型和引用类型
- ww
- html+css——<q>标签
- C# 连接FTP 时 关于路径的问题
- iBeacon技术分析文档
- Android初级教程Fragment到Fragment的通信初探
- Android初级教程Fragment到Fragment的通信初探
- 瞰视图代码详解
- asp.net获取当前网址url\域名