您的位置:首页 > 其它

UVa 10585 - Center of symmetry

2013-07-18 21:48 1101 查看


给出若干个点的坐标,问是否存在一个点,这个点是所有点的中点

我的思路:排序+二分查找(详见代码)

#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef struct point
{
double x;
double y;
} point;
point a[10010];
int cmp(point a,point b)//排序函数
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int cmp2(point a,point b)//比较函数
{
if(fabs(a.x-b.x)<1e-8)
{
if(fabs(a.y-b.y)<1e-8)return 0;
else if(a.y<b.y)return -1;
else if(a.y>b.y)return 1;
}
else if(a.x<b.x)return -1;
else return 1;
}
int f(point p,int n)//二分查找
{
int L=0,R=n-1,mid=(L+R)/2;
while(L<R)
{
if(cmp2(p,a[mid])>0)L=mid+1;
else R=mid;
mid=(L+R)/2;
}
if(cmp2(p,a[mid])==0)return 1;
else return 0;
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
double x=0,y=0;
for(int i=0; i<n; i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
x+=a[i].x;
y+=a[i].y;
}
x/=n;
y/=n;
sort(a,a+n,cmp);
int flag=0;

for(int i=0; i<n; i++)
{
point k;
k.x=x+(x-a[i].x);
k.y=y+(y-a[i].y);
if(!f(k,n))
{
flag=1;
break;
}
}
if(flag)puts("no");
else puts("yes");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: