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;

}

你可能感兴趣的:(poj)