POJ 1328 贪心 Radar Installation

//考察点:贪心算法,数轴上有n个闭区间[ai; bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)
//提交情况:wrong answer 3次,原因:将tmp定义成了int
//收获:关键是如何排序,先按右端点从小到大排序,若右端点相等则按左端点从大到小排序.此题只按照右端点排序就能ac。
//AC code
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<math.h>
using namespace std;
int n,d;

struct line{
	double left,right;
};
line ln[1005];

int cmp(line a,line b){
	if(a.right<b.right)
		return 1;
	//else if(a.right==b.right){
	//	return a.left>b.left;
	//}
	return 0;
}
int main(){
	int cases=0;
	while(scanf("%d%d",&n,&d)){
		if(n==0&&d==0)
			break;
		cases++;
		int i,x,y;
		bool flag=false;
		for(i=0;i<n;i++){
			scanf("%d%d",&x,&y);
			if(y>d)
				flag=true;
			ln[i].left=x-sqrt((d*d-y*y)*1.0);
			ln[i].right=x+sqrt((d*d-y*y)*1.0);
		}
		if(!flag){
			sort(ln,ln+n,cmp);
			int res=1;
			//眼瞎了,这儿当时写成int了
			double tmp=ln[0].right;
			for(i=1;i<n;i++){
				if(ln[i].left<=tmp&&ln[i].right>=tmp)
					continue;
				else{
					tmp=ln[i].right;
					res++;
				}
			}
			printf("Case %d: %d\n",cases,res);
		}else{
			printf("Case %d: -1\n",cases);
		}
	}
	return 0;
}

你可能感兴趣的:(算法,BI,ini)