题解 P1227 【[JSOI2008]完美的对称】

z3475

2017-10-19 19:42:51

Solution

我们可以找出横坐标与纵坐标最大的点和最小的点,他们连起来的线段的中点显然是对称点(对于有对称点的情况) 但怎么判断没有对称点的情况呢?我们可以去掉上述说的俩点,再找出横坐标与纵坐标最大的点和最小的点,检查连起来的线段的中点符不符合上一次的情况。 显然找最大和最小的点可以使用排序(比较函数一定要写对),上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; } ```