BC 62 (div.2) B

来源:互联网 发布:mysql批量更新数据 编辑:程序博客网 时间:2024/06/05 12:43

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(1T10),表示数据的组数。每组数据有55行,每行有两个实数x_i, y_i(-10^9 \le x_i, y_i \le 10^9)xi,yi(109xi,yi109),表示第ii个点的坐标。
输出描述
如果两个量相差小于10^{-4}104,则认为这两个量相等。对于每组数据,如果这55个点能组成一个五角星,则输出YesYes,否则输出NoNo。(如果55个点相同,那么也能组成一个五角星。)
输入样例
23.0000000 0.00000000.9270509 2.85316950.9270509 -2.8531695-2.4270509 1.7633557-2.4270509 -1.76335573.0000000 1.00000000.9270509 2.85316950.9270509 -2.8531695-2.4270509 1.7633557-2.4270509 -1.7633557
输出样例
YesNo
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-4int 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;}



0 0