题解 UVA1193 【Radar Installation】

发布于 2020-11-21


是一道比较简单的贪心,主要是对公式的运用。

题意

多组测试数据。

给你n个坐标上的点, n <= 1000。

你可以在x轴上放置雷达,每个雷达的辐射半径都是d。

现在问你辐射到所有的点至少需要几个雷达,如果辐射不到所有的点输出-1。

题解

因为二维的贪心比较困难,所以我们使用圆形的公式即可。用公式转化后,就变成了一道覆盖区间的普通贪心。

代码

#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define eps 0.0000005
using namespace std;
struct note 
{
	double x;
	double y;
}a[30001];
int n;
double s;
double l,r;
int sum;
bool cmp(note a,note b)
{
	return a.x<b.x;
}
int main()
{
	cin>>n>>s;
	while(n&&s)
	{
		int flag=0;
		for(int i=0;i<n;i++) 
		{
			cin>>l>>r;
			if(abs(r)>s) flag=1;
			a[i].x=l-sqrt(s*s-r*r);
			a[i].y=l+sqrt(s*s-r*r);//公式的运用
		}
		if(flag) //特判
		{
			cout<<"Case "<<++sum<<": -1"<<endl;
			for(int i=0;i<n;i++) a[i].x=a[i].y=0.0;
			scanf("\n%d %lf",&n,&s);
			continue;
		}
		sort(a,a+n,cmp);//开始寻找
		double right=a[0].y;
		int ans=1;
		for(int i=1;i<n;i++)
			if(a[i].x<=right) right=min(right,a[i].y);
			else right=a[i].y,ans++;
		cout<<"Case "<<++sum<<": "<<ans<<endl;
		for(int i=0;i<n;i++) a[i].x=a[i].y=0.0;
		scanf("\n%d %lf",&n,&s);
	}
	return 0;
}