给定平面中的若干点,判断是否存在由这些点构成的线段组中所有线段都交于一点。对于x坐标,找出最大和最小值,对应的两个点一定要构成一条线段,那么中点的x坐标就确定了,同理对于y坐标,注意这两组点不一定相同。然后对其他点,根据中点求出另一个点,查找是否在给定的点集中即可。
Source:
#include<iostream>
#include<algorithm>
#include<utility>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b);
pair<int,int> pp[10010],mid,tmp;
int main()
{
int cse,i,n,mxi,mii,mxj,mij;
cin>>cse;
for(;cse>0;--cse)
{
cin>>n;
for(i=0;i<n;++i)
{
cin>>pp[i].first>>pp[i].second;
if(i==0)
{
mxi=pp[i].first;
mii=pp[i].first;
mxj=pp[i].second;
mij=pp[i].second;
}else
{
if(pp[i].first<mii)
mii=pp[i].first;
if(pp[i].first>mxi)
mxi=pp[i].first;
if(pp[i].second<mij)
mij=pp[i].second;
if(pp[i].second>mxj)
mxj=pp[i].second;
}
}
sort(pp,pp+n,cmp);
mid.first=mii+mxi;
mid.second=mij+mxj;
// if(n%2==0)
// {
// i=n/2;
// mid.first=pp[i].first+pp[i-1].first;
// mid.second=pp[i].second+pp[i-1].second;
// }else
// {
// i=n/2;
// mid.first=2*pp[i].first;
// mid.second=2*pp[i-1].second;
// }
for(--i;i>=0;--i)
{
tmp.first=mid.first-pp[i].first;
tmp.second=mid.second-pp[i].second;
if(!binary_search(pp,pp+n,tmp))break;
}
if(i<0)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.first<b.first || a.first==b.first && a.second<b.second;
}
#include<algorithm>
#include<utility>
using namespace std;
bool cmp(pair<int,int> a,pair<int,int> b);
pair<int,int> pp[10010],mid,tmp;
int main()
{
int cse,i,n,mxi,mii,mxj,mij;
cin>>cse;
for(;cse>0;--cse)
{
cin>>n;
for(i=0;i<n;++i)
{
cin>>pp[i].first>>pp[i].second;
if(i==0)
{
mxi=pp[i].first;
mii=pp[i].first;
mxj=pp[i].second;
mij=pp[i].second;
}else
{
if(pp[i].first<mii)
mii=pp[i].first;
if(pp[i].first>mxi)
mxi=pp[i].first;
if(pp[i].second<mij)
mij=pp[i].second;
if(pp[i].second>mxj)
mxj=pp[i].second;
}
}
sort(pp,pp+n,cmp);
mid.first=mii+mxi;
mid.second=mij+mxj;
// if(n%2==0)
// {
// i=n/2;
// mid.first=pp[i].first+pp[i-1].first;
// mid.second=pp[i].second+pp[i-1].second;
// }else
// {
// i=n/2;
// mid.first=2*pp[i].first;
// mid.second=2*pp[i-1].second;
// }
for(--i;i>=0;--i)
{
tmp.first=mid.first-pp[i].first;
tmp.second=mid.second-pp[i].second;
if(!binary_search(pp,pp+n,tmp))break;
}
if(i<0)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.first<b.first || a.first==b.first && a.second<b.second;
}