例题UVA1193
问题简化为:我们在数轴上有很多个区间,让你求这么一个东西,用尽可能少的点覆盖掉所有的区间(一个点能覆盖含这个点的所有区间),求出用多少个点。
步骤:
1.区间右值进行排序。
2.维护一个边界值,每增加一个点,就更新这个边界值。
3.输出点的个数。
本题一个岛屿就对应着一个区间,安放雷达就是安放点。
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <fstream>
using namespace std;
const int maxn=1010;
const int inf=0x3f3f3f3f;
struct s
{
double l,r;
friend bool operator<(s a, s b)
{
if(a.r!=b.r) return a.r<b.r;
return a.l<b.l;
}
}res[maxn];
int main()
{
int n,d;
int cas=1;
while(cin>>n>>d&&n&&d)
{
memset(res,0,sizeof(res));
bool f=1;
int x,y;
for(int i=0;i<n;i++ )
{
scanf("%d%d",&x,&y);
res[i].l=(double)x-sqrt((double)d*d-y*y);
res[i].r=(double)x+sqrt((double)d*d-y*y);
if(y>d)
{
f=0;
}
}
printf("Case %d: ",cas++);
if(f)
{
sort(res,res+n);
double b=res[0].r;
int cnt=1;
for(int i=1;i<n;i++)
{
if(b<res[i].l)
{
cnt++;
b=res[i].r;
}
}
printf("%d",cnt);
}
else
{
printf("-1");
}
printf("\n");
}
}