nyoj 710 外星人的供給站
外星人的供給站
時間限制:1000 ms | 內存限制:65535 KB
難度:3
描述
外星人指的是地球以外的智慧生命。外星人長的是不是與地球上的人一樣並不重要,但起碼應該符合我們目前對生命基本形式的認識。比如,我們所知的任何生命都離不開液態水,並且都是基於化學元素碳(C)的有機分子組合成的復雜有機體。
42歲的天文學家Dr. Kong已經執著地觀測ZDM-777星球十多年了,這個被稱為“戰神”的紅色星球讓他如此著迷。在過去的十多年中,他經常有一些令人激動的發現。ZDM-777星球表面有著明顯的明暗變化,對這些明暗區域,Dr. Kong已經細致地研究了很多年,並且繪制出了較為詳盡的地圖。他堅信那些暗區是陸地,而亮區則是湖泊和海洋。他一直堅信有水的地方,一定有生命的痕跡。
這天晚上的觀測條件實在是空前的好,ZDM-777星球也十分明亮,在射電望遠鏡中呈現出一個清晰的暗紅色圓斑。還是那些熟悉的明暗區域和極冠,不過,等等,Dr. Kong似乎又撲捉到曾看到過的東西,那是什麽,若隱若現的。他盡可能地睜大了眼睛,仔細地辨認。哦,沒錯,在一條直線上,又出現了若幹個極光點連接著星球亮區,幾分鐘後,極光點消失。
Dr. Kong大膽猜想,ZDM-777星球上的湖泊和海洋裏一定有生物。那些極光點就是ZDM-777星球上的供給站,定期給這些生物提出維持生命的供給。
不妨設,那條直線為X軸,極光點就處在
接著,Dr. Kong 又有驚人的發現,所有的亮區Pi都處在某個半徑為R的極光點圓內。去掉一個極光點就會有某些亮區Pj不處在覆蓋區域內。
Dr. Kong想知道,至少需要多少個極光點才能覆蓋所有的湖泊和海洋。
輸入
第一行: K 表示有多少組測試數據。
接下來對每組測試數據:
第1行: N R
第2~N+1行: PXi PYi (i=1,…..,N)
【約束條件】
2≤K≤5 1≤R≤50 1≤N≤100 -100≤PXi PYi≤100 | PYi | ≤ R
R, PXi PYi都是整數。數據之間有一個空格。
輸出
對於每組測試數據,輸出一行: 最少需要的極光點數。
樣例輸入
2
3 2
1 2
-3 1
2 1
1 5
5 5
樣例輸出
2
1
#include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; struct point{ double left; //左交點 double right; //右交點 }w[1001]; bool cmp(const point a,const point b) { if(a.left<b.left) return true; return false; } int main() { int t,n,r,x,y; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&r); memset(w,0,sizeof(w)); int count=1; //計數器 double len,t; for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); // if(y>r) // { // //printf("-1\n"); // break; // } // len=sqrt(((double)r*r)-((double)y*y)); //勾股定理 w[i].left=(double)x-len; w[i].right=(double)x+len; } sort(w,w+n,cmp); t=w[0].right; for(int i=1;i<n;i++) { if(w[i].left>t)//**如果後一個點的左交點大於前一個點的右坐標, //說明兩點沒有公共區域 { count++; t=w[i].right; } else { if(w[i].right<t)//**如果後一個點的右交點小於前一個點的右坐標, //說明後一個點的覆蓋區域被前一個點包含了**// { t=w[i].right;//**保證後一個點被覆蓋 } } } printf("%d\n",count); } return 0; }
nyoj 710 外星人的供給站