洛谷P1227[JSOI2008]完美的對稱
洛谷P1227[JSOI2008]完美的對稱
題目描述
在峰會期間,必須使用許多保鏢保衛參加會議的各國代表。代表們除了由他自己的隨身保鏢保護外,組委會還指派了一些其他的特工和阻擊手保護他們。為了使他們的工作卓有成效,使被保衛的人的安全盡可能得到保障,保鏢被分配到被保護人的各個方向。
保鏢的最佳站立位置應該是這樣的:被保護人應站在所有保鏢的對稱中心。但是,只要被保
護人一移動,保鏢就很難根據要人的新位置調整位置。大多數的特工都很難對此作出實時調整。
因此,安全部長決定將該過程逆轉一下,保鏢先站好自己的位置,然後要人在他們的對稱中心找到合適的位置。如果要人隨便走動,我們就對他的安全不必負責。
你的工作是使這個過程自動操作。給出一組N個點(保鏢的位置),你要找出它們的對稱中心S,在這兒被保護人將相對安全。下面以此類推。
首先我們給定一點A以及對稱中心S,點A‘是點A以S為對稱中心形成的像點,即點S是線段AA‘的對稱中心。
點陣組(X)以S為中心的像點是由每個點的像點組成的點陣組。X是用來產生對稱中心S的,即點陣X以S為中心的像點的集合即為點陣X本身。
輸入輸出格式
輸入格式:
輸入文件第一行是一個整數N,1<=N<=20000,接下來的N行每行包含用空格隔開的兩個整數Xi和Yi,-100000<=Xi,Yi<=100000,表示這組點陣中第I個點的笛卡爾坐標值。
因為任何兩個保鏢都不會站在同一個位置上,所以在給定的作業中,任何兩點都不相同。但註意保鏢可以站在被保護人相同的位置。
輸出格式:
輸出文件僅有一行。如果給定的點陣能產生一個對稱中心,則輸出“V.I.P. should stay at (x,y).”,其中X和Y代表中心的笛卡爾坐標值,格式為四舍五入保留至小數點後一位。
如果該組點陣無對稱中心,輸出"This is a dangerous situation!",註意輸出時除了兩個單詞之間用一個空格隔開外,不要輸出多余空格。
輸入輸出樣例
輸入樣例#1: 復制8 1 10 3 6 6 8 6 2 3 -4 1 0 -2 -2 -2 4輸出樣例#1: 復制
V.I.P. should stay at (2.0,3.0).
說明
[JSOI2008]第二輪
代碼
隨便畫畫應該都能找到特點吧。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=20000+5; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘) {if(ch==‘-‘) f=-1; ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } int n; struct node { int x,y; bool operator < (const node& j) const { return x==j.x? y<j.y : x<j.x; } }a[maxn]; int main() { n=read(); for(int i=1;i<=n;i++) { a[i].x=read();a[i].y=read(); } sort(a+1,a+n+1); double xx,yy; xx=((double)(a[1].x+a[n].x))/2.0; yy=((double)(a[1].y+a[n].y))/2.0; for(int i=2;i<=(n/2);i++) { double x,y; x=(a[i].x+a[n-i+1].x)/2.0; y=(a[i].y+a[n-i+1].y)/2.0; if(x!=xx||y!=yy) { printf("This is a dangerous situation!"); return 0;} } printf("V.I.P. should stay at (%.1lf,%.1lf).",xx,yy); return 0; }
洛谷P1227[JSOI2008]完美的對稱