1. 程式人生 > >第六屆河南省程式設計大賽:外星人的供給站

第六屆河南省程式設計大賽:外星人的供給站

描述

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