POJ 1328 贪心、快排/求最少雷达数量

对于每个岛屿,计算出在区间[A,B]内必须有一个雷达,对这些区间的左坐标进行排序

第一个岛屿的右坐标为right,

初始雷达数量为1,对于第二个岛屿,如果它的右坐标比right小,则说明区间2包含了区间1,不用增加雷达数量,并设置right = 岛屿2的右坐标;

如果它的右坐标比right大,又岛屿2的左坐标大于right,则雷达数量+1,并设置right = 岛屿2的右坐标.

#include <algorithm>
#include <math.h>
#include <iostream>
using namespace std;
typedef struct island{
	double l;
	double r;
}Node;
int   qcmp(   const   void   *arg1,   const   void   *arg2   )   
{   
	
	return   (((Node*)arg1)->l >  ((Node*)arg2)->l)?1:-1;
}
int   cmp(   Node   arg1,   Node   arg2   )   
{   
	
	return   arg1.l<  arg2.l;
}
int main(int argc, char* argv[])
{
	//freopen("d:/t.txt","r",stdin);
	int count;
	int r;
	
	int c = 0;
	while(cin>>count>>r&&(count||r)){
		bool err = false;
		Node n[1000];
		c++;
		for(int i=0;i<count;i++){
			double x,y;
			cin>>x>>y;
			y=y<0?-y:y;
			if(y>r){
				err = true;
			}
			double d = sqrt(r*r-y*y);
			
			n[i].l = x-d;
			n[i].r = x+d;
			
		}
		if(err)
		{
			printf("Case %d: -1\n",c);
			continue;
		}
		qsort(n,count,sizeof(n[0]),qcmp);
		//sort(n,n+count,cmp);
		
		int ans = 1;
		double left = n[0].r;

		for(int j=1;j<count;j++){
			if(n[j].r<=left){
				left = n[j].r;
			}else{
				if(n[j].l>left){ans++;left = n[j].r;}
			}
		}
		printf("Case %d: %d\n",c,ans);
			
	}
	return 0;
}
posted on 2011-06-10 21:51  yangyh  阅读(516)  评论(0编辑  收藏  举报