给定平面中的若干点,判断是否存在由这些点构成的线段组中所有线段都交于一点。对于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;
}