POJ 1328 贪心算法

本文介绍了一种使用雷达覆盖所有岛屿的算法,通过计算雷达的覆盖区间并进行排序,然后从左向右检查每个区间是否能被前一个区间完全覆盖。若不能,则增加覆盖次数,最终得到覆盖所有岛屿所需的雷达数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:使用雷达覆盖所有的岛屿。给定的是岛屿的个数n和雷达的半径d,n行的坐标(x,y),首先将雷达的区间求出来并排序。然后从左向右看,当发现下一个区间的起始点大于前面所有区间的最小结束点的时候,答案加1.

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=1001;
int ans=0;
int n,d;
bool ok;
struct Position
{
	int x;
	int y;
}position[maxn];
bool operator <(const Position &a,const Position &b)
{
	return a.x<b.x;
}
bool operator ==(const Position &a,const Position &b)
{
	return (a.x==b.x)&&(a.y==b.y);
}
void init()
{
	int i;
	ok=true;
	for (i=0;i<n;i++)
	{
		cin>>position[i].x>>position[i].y;
		if (position[i].y>d)
		{
			ok=false;
		}
	}
}
double getx(Position &position)
{
	return position.x+sqrt(double(d*d-position.y*position.y));
}
void work()
{
	double x,temp;
	int i;
	x=getx(position[0]);
	ans=1;
	for (i=1;i<n;i++)
	{
		temp=getx(position[i]);
		if (x>temp&&x>position[i].x)
		{
			x=temp;
			continue;
		}
		if ((position[i].x-x)*(position[i].x-x)+(position[i].y*position[i].y)<=d*d)
		{
			continue;
		}
		x=getx(position[i]);
		ans++;
	}
}
int main(int argc,char *argv[])
{
	int casenum=0;
	while (cin>>n>>d &&n!=0&&d!=0)
	{
		init();
		casenum++;
		if (!ok)
		{
			cout<<"Case "<<casenum<<": -1"<<endl;
			continue;
		}
		sort(position,position+n);
		work();
		cout<<"Case "<<casenum<<": "<<ans<<endl;
	}
	return 0;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值