题解 P1227 【[JSOI2008]完美的对称】
z3475
2017-10-19 19:42:51
我们可以找出横坐标与纵坐标最大的点和最小的点,他们连起来的线段的中点显然是对称点(对于有对称点的情况)
但怎么判断没有对称点的情况呢?我们可以去掉上述说的俩点,再找出横坐标与纵坐标最大的点和最小的点,检查连起来的线段的中点符不符合上一次的情况。
显然找最大和最小的点可以使用排序(比较函数一定要写对),上C++代码(24ms过)
不要抄题解
```cpp
#include <bits/stdc++.h>
using namespace std;
struct point{
int x,y;
}p[20001]; //普通点
struct pointf{
double x,y;
}; //存对称点(对称点可能是浮点数)
int n;
bool cmp(const point &a,const point &b){
if (a.x==b.x)
return a.y>b.y;
return a.x>b.x;
} //比较函数,x大的点在前面,相等就按y来排
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p+1,p+1+n,cmp);//排序
int l=2,r=n-1;//左右2点对应
//以下初始化当前情况的中点
pointf center;
center.x = ((p[1].x+p[n].x)/2.0f);
center.y = ((p[1].y+p[n].y)/2.0f);
//以下开始检查对称点对不对
while (l<r){
if (center.x!=((p[l].x+p[r].x)/2.0f)||center.y!=((p[l].y+p[r].y)/2.0f))
{printf("This is a dangerous situation!");return 0;}
l++,r--;
}
//保留俩位输出
printf("V.I.P. should stay at (%.1f,%.1f).",center.x,center.y);
return 0;
}
```