YTU3639:建立雷达 C++ 贪心

 


题目描述

一共有 nnn 个小岛位于 xxx 轴之上, xxx 轴为海岸, xxx 轴上方为海洋。现需要在海岸上建立雷达。
在海岸建立的最少的雷达数目,使得雷达可以覆盖所有的小岛。可以认为每个小岛都是一 个点。
如图所示,三个小岛分别是 P1,P2,P3P_1, P_2, P_3P1​,P2​,P3​, 雷达的半径 d=2,d=2,d=2, 在 xxx 轴上建立两个雷达 (−2,0)(-2,0)(−2,0) 和 (1,0)(1,0)(1,0) 就能覆盖三个小岛。

输入

输入包含若干组数据,每组数据的第一行是两个整数 nnn 和 ddd (1⩽n⩽10001 \leqslant n \leqslant 10001⩽n⩽1000),分别表示小岛的个数和雷达的半径。接下来有 nnn 行,每行的两个整数分别表示各个小岛的坐标。输入以 0 0 结束。 

输出

对于每组数据输出一行,为最少的雷达数。如果该组数据无解,则输出 −1-1−1。

输入输出样例

样例输入 #1

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

样例输出 #1

Case 1:2
Case 2:1

代码部分

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n,d;
struct sbtz
{
	int x,y;
	float x1,x2;
};

bool tzsb(sbtz a,sbtz b)
{
	return a.x1<b.x1;
}
int main()
{
	int m=0;
	while(1)
	{
		m++;
		cin>>n>>d;
		if(n==0&&d==0)
			break;
		sbtz l[1005];
		bool t=0;
		for(int i=0;i<n;i++)
		{
			cin>>l[i].x>>l[i].y;
			if(l[i].y>d)
				t=1;
			l[i].x1=l[i].x-(d*d-l[i].y*l[i].y);	
			l[i].x2=l[i].x+(d*d-l[i].y*l[i].y);
		}
		if(t)
		{
			cout<<"Case "<<m<<":-1"<<endl;
			continue;
		}
		sort(l,l+n,tzsb);
		float Min=l[0].x2;
		int ans=1;
		for(int i=1;i<n;i++)
		{
			if(l[i].x1>Min)
			{
				ans++;
				Min=l[i].x2;
			}
			else
			{
				Min=min(Min,l[i].x2);
			}
		}
		cout<<"Case "<<m<<":"<<ans<<endl;
	} 
	return 0;
}

学习愉快!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值