Radar Installation(POJ1328转化为活动安排问题)
【题目链接】:点击打开链接
【解题思路】:刚开始没思路,但感觉是挺简单的动态问题,要么是贪心,要么动态,凭直觉认之为贪心(水平有限,暂时只能凭感觉)
但如何贪心呢?无从下手啊,如果先按横坐标再按纵坐标排序,那最终距离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; }