您的位置:首页 > 其它

BC 62 (div.2) B

2015-11-14 23:12 337 查看


Clarke and five-pointed star

 
 Accepts: 237
 
 Submissions: 591

 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 65536/65536 K (Java/Others)

问题描述
克拉克是一名人格分裂患者。某一天克拉克分裂为一个几何学习者,在研究多边形。
在研究某一个多边形的时候,克拉克发现他多次遇到判断5个点是否能组成一个五角星的问题,在这里,这5个点分别代表五角星的五个顶点(顶角上的点)。于是他跑来想你求助,让你写出一个程序快速判定。即对于给出的5个点,判断这5个点是否能组成一个五角星。

输入描述
第一行一个整数T(1 \le T \le 10)T(1≤T≤10),表示数据的组数。
每组数据有55行,每行有两个实数x_i, y_i(-10^9 \le x_i, y_i \le 10^9)x​i​​,y​i​​(−10​9​​≤x​i​​,y​i​​≤10​9​​),表示第ii个点的坐标。

输出描述
如果两个量相差小于10^{-4}10​−4​​,则认为这两个量相等。
对于每组数据,如果这55个点能组成一个五角星,则输出YesYes,否则输出NoNo。(如果55个点相同,那么也能组成一个五角星。)

输入样例
2
3.0000000 0.0000000
0.9270509 2.8531695
0.9270509 -2.8531695
-2.4270509 1.7633557
-2.4270509 -1.7633557
3.0000000 1.0000000
0.9270509 2.8531695
0.9270509 -2.8531695
-2.4270509 1.7633557
-2.4270509 -1.7633557

输出样例
Yes
No

Hint
样例1如图

样例2如图


判断正五角星,开始是用数学知识过的,最后被HACK了。这里有一个比较简单易写的思路。依次求出这5个点到其他4个点的距离,再排序,如果是正5边型那么排序后的数组的距离大小是对应相等的。

这一题应该特别注意一下精度问题,不要开的太高,我输出了一下,最多精确后6位就开始有误差了,开个4,5位的就可以了


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct point
{
double a,b;
}eg[20];
double leg[20][20];
inline double f(point &x1,point &x2)
{
double temp= (x1.a-x2.a)*(x1.a-x2.a)+(x1.b-x2.b)*(x1.b-x2.b);
return sqrt(temp);
}
#define eps 1e-4
int main()
{
#ifdef CDZSC
freopen("i.txt","r",stdin);
#endif
int t;
scanf("%d",&t);
while(t--)
{
for(int i=0;i<5;i++)
{
scanf("%lf%lf",&eg[i].a,&eg[i].b);
}
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
leg[i][j]=f(eg[i],eg[j]);
}
sort(leg[i],leg[i]+5);
}
int ok=1;
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
double temp=leg[0][i];
if(fabs(leg[j][i]-temp)>eps)
{
ok=0;
break;
}
}
}
puts(ok?"Yes":"No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: