POJ 1328

题意:给你n个海岛,一个d,代表雷达范围,每个海岛的坐标,现在你只能在x轴上建雷达,问探测到所有海岛最少需要多少个雷达,如果不能探测到所有的,输出-1。


做法:贪心,将每个灯塔预处理为[l,r]范围,然后问题就变成了,给你n个区间,用最少的点使得所有的区间都至少含有一个点。


#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct node{
	double x,y;
}e[1005];
bool cmp(node a,node b){
	return a.x<b.x;
}
double a[1005];
int main(){
	int n,i,j,csa=1;
	double d,x,y;
	while(cin>>n>>d){
		if(n==0&&d==0)break;
		int flag=1;
		for(i=1;i<=n;i++){
			scanf("%lf%lf",&x,&y);
			e[i].x=x-sqrt(d*d-y*y);
			e[i].y=x+sqrt(d*d-y*y);
			if(y>d)flag=0;
		}	
		sort(e+1,e+1+n,cmp);
		int cnt=1;
		cout<<"Case "<<csa++<<": ";
		if(!flag)cout<<"-1"<<endl;
		if(!flag)continue;
		node temp=e[1];
		for(i=2;i<=n;i++){
			if(e[i].x>temp.y){
				cnt++;
				temp=e[i];
			}
			else if(e[i].y<temp.y){
				temp=e[i];
			}
		}
		cout<<cnt<<endl;
	} 
	return 0;
}


你可能感兴趣的:(POJ 1328)