poj 1328

2014/12/10


太渣,錯了很多次。。貪心貪吧,貪吧。

一個個遍歷算半徑會有精度問題,要一開始就算出點的所在的左右半徑中心。。


#include<stdio.h>
#include<string.>
#include<algorithm>
#include<math.h>
using namespace std;
double d;
struct node{
	double l,r;
}s[1005];

int cmp(node a,node b)
{

	return a.l<b.l;
}


int main()
{
	int n;
	int k = 1;
	double a,b;
	while(~scanf("%d%lf",&n,&d)&&n&&d)
	{
		
		int temp = 0;
		for(int i =0 ;i < n; i++)
		{
			scanf("%lf%lf",&a,&b);
			if(fabs(b) > d)
			{
				temp = 1;
			}
			s[i].l = a-sqrt(d*d-b*b);
			s[i].r = a+sqrt(d*d-b*b);
		}
		if(temp)
		{
			printf("Case %d: -1\n",k++);
			continue;
		}
		sort(s,s+n,cmp);

	     double point ;
		  int cnt = 1;
		  point = s[0].r;
		
		for(int i = 1;i < n; i++)
		{
			if(point < s[i].l)
			{
			     point  = s[i].r;
			     cnt++;
			}
			else if(point > s[i].r)
			{
				point = s[i].r;
			}
			
		}
		
		printf("Case %d: %d\n",k++,cnt);
	}
	return 0;
} 


發佈了123 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章