第六屆河南省程式設計大賽:外星人的供給站
描述
外星人指的是地球以外的智慧生命。外星人長的是不是與地球上的人一樣並不重要,但起碼應該符合我們目前對生命基本形式的認識。比如,我們所知的任何生命都離不開液態水,並且都是基於化學元素碳(C)的有機分子組合成的複雜有機體。
42歲的天文學家Dr. Kong已經執著地觀測ZDM-777星球十多年了,這個被稱為“戰神”的紅色星球讓他如此著迷。在過去的十多年中,他經常有一些令人激動的發現。ZDM-777星球表面有著明顯的明暗變化,對這些明暗區域,Dr. Kong已經細緻地研究了很多年,並且繪製出了較為詳盡的地圖。他堅信那些暗區是陸地,而亮區則是湖泊和海洋。他一直堅信有水的地方,一定有生命的痕跡。Dr. Kong有一種強烈的預感,覺得今天將會成為他一生中最值得紀念的日子。
這天晚上的觀測條件實在是空前的好,ZDM-777星球也十分明亮,在射電望遠鏡中呈現出一個清晰的暗紅色圓斑。還是那些熟悉的明暗區域和極冠,不過,等等,Dr. Kong似乎又撲捉到曾看到過的東西,那是什麼,若隱若現的。他儘可能地睜大了眼睛,仔細地辨認。哦,沒錯,在一條直線上,又出現了若干個極光點連線著星球亮區,幾分鐘後,極光點消失。
Dr. Kong大膽猜想,ZDM-777星球上的湖泊和海洋裡一定有生物。那些極光點就是ZDM-777星球上的供給站,定期給這些生物提出維持生命的供給。
不妨設,那條直線為X軸,極光點就處在X軸上,N個亮區P1,P2,…Pn就分佈在若干個極光點周圍。
接著,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
先給數按照x軸排個序,點的地方肯定要和圓的邊重合才最好,以便後面的點在前面這個圓內。
但是像這種情況就要把圓心向右挪動。
一直重複上面的過程直到最後一個點。
#include<stdio.h> #include<algorithm> #include<math.h> #define N 120 using namespace std; typedef struct data { int x; int y; }data; data a[N]; int cmp(data a,data b) { return a.x>b.x ? 0:1; } int main() { int k,n,r,i,ans; double point; scanf("%d",&k); while(k--) { ans=0; scanf("%d%d",&n,&r); for(i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y); sort(a,a+n,cmp); point = ( (double)( sqrt( r*r - a[0].y*a[0].y) + a[0].x ) ) ; ans++; for(i=1;i<n;i++) { if( ( (double)((a[i].x-point) * (a[i].x-point) + a[i].y * a[i].y ) ) <= r*r ) continue; else if(a[i].x<point) { point=point - (point - a[i].x - (double)( sqrt ( r*r - a[i].y*a[i].y))); continue; } else { point = (double)(sqrt( r*r - a[i].y*a[i].y ) + a[i].x ) ; ans++; } } printf("%d\n",ans); } return 0; }