BestCoder Round #62 (div.2)Clarke and five-pointed star(极角排序,判断五边形)
2015-11-15 11:17
447 查看
题目链接
题意:给你五个点,问这五个点是否可以组成正五边形(正五角星,等价于正五边形)。
解答:先极角排序,(让五个点按照顺时针或者逆时针的顺序)然后我们计算五条边是不是一样,然后在看对角线是不是都一样。
题意:给你五个点,问这五个点是否可以组成正五边形(正五角星,等价于正五边形)。
解答:先极角排序,(让五个点按照顺时针或者逆时针的顺序)然后我们计算五条边是不是一样,然后在看对角线是不是都一样。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<set> #include<map> #include<string> #include<cstring> #include<stack> #include<queue> #include<vector> #include<limits> #include<ctime> #include<cassert> #include<cstdlib> using namespace std; #define LL long long #define pb push_back #define X first #define Y second #define cl(a,b) memset(a,b,sizeof(a)) typedef pair<double,double> P; const int maxn=100005; const int inf=1<<27; #define mod 1000000007 #define eps 1e-4 struct point{ double x,y; }p[5]; bool cmp(const point& p1, const point& p2){//极角排序 return atan2(p1.y, p1.x) < atan2(p2.y, p2.x); } double f(double x){return x*x;} double dis(point a,point b){ return sqrt(f(a.x-b.x)+f(a.y-b.y)); } double s[maxn]; bool isok(){ int num=0; for(int i=0;i<5;i++){//把边和对角线都算出来 for(int j=0;j<5;j++)if(i!=j){ s[num++]=dis(p[i],p[j]); } } sort(s,s+num);//排序 int ans=0; for(int i=1;i<num;i++){//如果结果是有2个数字,那么是合法的 ,因为,5个边是一样的,对角线也都是一样的,且对角线是比边大 if(fabs(s[i]-s[i-1])>eps)ans++; } return ans==1; } int main(){ int T; scanf("%d",&T); while(T--){ for(int i=0;i<5;i++){ scanf("%lf%lf",&p[i].x,&p[i].y); } sort(p,p+5,cmp); if(isok()){ puts("Yes"); } else{ puts("No"); } } return 0; }
相关文章推荐
- 1025. 反转链表 (25)
- LeetCode:Product of Array Except Self
- 信息安全系统设计基础实验一 20135211&20135216
- Windows下Mex程序的调试
- ParentChildTest.java
- 多态与异常处理课后作业
- 匿名内部类-细节
- CSS3 from W3C学习笔记
- 在Matlab中使用mex函数进行C/C++混合编程
- 释放模式-JDK7之后带资源的try构造
- LeetCode OJ:Range Sum Query - Immutable(区域和)
- App的网络性能优化实践
- Matlab C混合编程
- 常见的一些宏定义
- HDU 2151:Worm【dp】
- HttpClient 登录爬取信息
- Dockerize Apache HAWQ [作者:陶征霖]
- BestCoder Round #62 (div.2)Clarke and food (简单贪心)
- list接口和set接口
- Android Studio的使用(一)--显示行号、快速查找方法源