標籤:i++ 集合 中心 自動 四捨五入 this div double ++
題目描述
在峰會期間,必須使用許多保鏢保衛參加會議的各國代表。代表們除了由他自己的隨身保鏢保護外,組委會還指派了一些其他的特工和阻擊手保護他們。為了使他們的工作卓有成效,使被保衛的人的安全儘可能得到保障,保鏢被分配到被保護人的各個方向。保鏢的最佳站立位置應該是這樣的:被保護人應站在所有保鏢的對稱中心。但是,只要被保護人一移動,保鏢就很難根據要人的新位置調整位置。大多數的特工都很難對此作出即時調整。因此,安全部長決定將該過程逆轉一下,保鏢先站好自己的位置,然後要人在他們的對稱中心找到合適的位置。如果要人隨便走動,我們就對他的安全不必負責。你的工作是使這個過程自動操作。給出一組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:
81 103 66 86 23 -41 0-2 -2-2 4
輸出範例#1:
V.I.P. should stay at (2.0,3.0).
按照點的座標從小到大排序,然後找出每一個點對的中點,判斷即可。
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 using namespace std; 5 6 struct point { 7 int x,y; 8 } a[20050]; 9 10 int n;11 double xx,yy;12 bool f=1;13 14 bool cmp(const point m,const point n) {15 return (m.x<n.x || (m.x==n.x && m.y<n.y));16 }17 18 int main() {19 scanf("%d",&n);20 for (int i=1; i<=n; i++) scanf("%d%d",&a[i].x,&a[i].y);21 sort(a+1,a+n+1,cmp);22 xx=(double)(a[1].x+a[n].x)/2;23 yy=(double)(a[1].y+a[n].y)/2;24 for (int i=2; i<=n-1; i++) {25 double x2=(double)(a[i].x+a[n+1-i].x)/2;26 double y2=(double)(a[i].y+a[n+1-i].y)/2;27 if (x2!=xx || y2!=yy) {f=0 ; break;}28 }29 if (f) printf("V.I.P. should stay at (%.1lf,%.1lf).",xx,yy); 30 else printf("This is a dangerous situation!");31 return 0;32 }
[JSOI2008] 完美的對稱