1. 程式人生 > >nyoj 710 外星人的供給站

nyoj 710 外星人的供給站

出現 十分 return sca 可能 分布 size center 研究

外星人的供給站

時間限制:1000 ms | 內存限制:65535 KB

難度:3

描述

外星人指的是地球以外的智慧生命。外星人長的是不是與地球上的人一樣並不重要,但起碼應該符合我們目前對生命基本形式的認識。比如,我們所知的任何生命都離不開液態水,並且都是基於化學元素碳(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

#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 外星人的供給站