雷达安装(区间贪心)

题目描述:

假设海岸线是一个无限长的直线,陆地位于海岸线的一侧,另一侧是海洋。每个小岛可以看做是海洋中的一个点。在海岸线上安装的任何一个雷达能够覆盖的距离是d,所以如果小岛距离雷达的最大距离是d那么这个小岛就能够被雷达信号覆盖到。

我们使用笛卡尔坐标系,把海岸线看做是X轴,海洋在X轴的上方,陆地在X轴的下方,给出每个小岛在海洋中的位置,并给出雷达的覆盖范围,你的任务是编写程序计算出,如果覆盖所有的小岛至少需要安装多少个雷达。小岛的位置是用x、y坐标表示的。

 

输入格式

输入包含多组测试数据。对于每组测试数据:

第一行是两个整数n(1≤n≤1000)和d,分别表示小岛的数量n和雷达的覆盖范围d。

接下来n行,每行两个整数,分别表示每个小岛的位置的坐标。

每组测试用例之间用一个空行隔开,当输入为“0 0”时,表示输入结束

输出格式

对于每组测试用例,先输出测试用例的编号,然后输出需要安装的雷达的数量,如果无解输出-1

输入输出样列

输入样例1:

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

输出样例1:

Case 1: 2
Case 2: 1

【耗时限制】1000ms 【内存限制】128MB

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <sstream>
#include <cstring>
#include <algorithm>
using namespace std;
int d,n,x,y,p;
struct S{
	double a,b;
}a[11000000];
bool cmp(const S &x,const S &y){
	return x.b<y.b;//函数判断;
}
int main(){
	while(cin>>n>>d&&n!=0&&d!=0){
		int f=1;
		for(int i=1;i<=n;++i){
			cin>>x>>y;
			if(y>d){
				f=0;
				continue;
			}
			a[i].a=x-sqrt(d*d-y*y);//算什么的忘了,就是算三角型的;
			a[i].b=x+sqrt(d*d-y*y);
		}
		if(f==0){
			printf("Case %d: %d\n",++p,-1);//输出格式
			continue;
		}
		else {
			sort(a+1,a+1+n,cmp);
			int ans=1,r=a[1].b;
			for(int i=2;i<=n;i++){
				if(a[i].a>r){
					ans++;
					r=a[i].b;
				}
			}
			printf("Case %d: %d\n",++p,ans);
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值