【题目链接】:点击打开链接
【解题思路】:刚开始没思路,但感觉是挺简单的动态问题,要么是贪心,要么动态,凭直觉认之为贪心(水平有限,暂时只能凭感觉)
但如何贪心呢?无从下手啊,如果先按横坐标再按纵坐标排序,那最终距离X轴的距离并不是与之一样同序的,所以暂时
没有想法。。。
后来,索性把之前做过的一道贪心题(buct-oj 2082: Cover The Enemy)拿过来重温,受其启发,原来选择贪心要先选择一个合适的顺序,按先横坐标后纵坐
标的关系排列的话仍然距离关系无法确定,所以干脆将距离预处理一下,将距离作为贪心选择顺序的依据,这样为最大限
度利用雷达监测范围,对于某一个点可在X轴求出能够被雷达监测的区间,这样问题便完全转化为经典的活动安排问题。
【程序】:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef struct POINT
{
int x,y;
double lp,rp;
}Point;
bool cmp(Point a,Point b)
{
return a.rp<b.rp;
}
int main()
{
//freopen("input.txt","r",stdin);
Point arr[1001];
int N=0,n,d,i;
while(~scanf("%d%d",&n,&d))
{
if(n==0 && d==0) break;
N++;
for(i=0;i<n;i++)
{
scanf("%d%d",&arr[i].x,&arr[i].y);
double len=sqrt(d*d-arr[i].y*arr[i].y);
if(len<0) {
printf("-1\n");
return 0;
}
arr[i].lp=arr[i].x-len;
arr[i].rp=arr[i].x+len;
}
sort(arr,arr+n,cmp);
double temp=arr[0].rp;
int cnt=0;
for(i=0;i<n;)
{
cnt++;
while(arr[i].lp<=temp) i++;
temp=arr[i].rp;
}
printf("Case %d: %d\n",N,cnt);
}
return 0;
}