poj1328 Radar Installation(贪心)
*题意:
用最少的雷达覆盖所有岛屿
*思路:
贪心,具体点就是把每个岛屿可以被雷达侦测的区间求出来,然后按照区间左边升序排序,区间的重合部分仅需一个雷达并且此雷达放在重合区间的最右侧(此处体现贪心)以尽可能侦测更多岛屿。
*注意:
尽可能减少运行时间,在poj上63ms就可以ac,不过同样的代码在杭电就过不去。
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> struct position { double x; double y; }; int cmp(const void* a, const void *b) { return ((position *)a)->y>((position*)b)->y ? 1 : -1; } using namespace std; int main() { int i,j=0,n,s,x,y,r; double m; position a[1008]; while(scanf("%d %d", &n, &r) == 2 && !(n==r && 0==r)) { memset(a,'\0',sizeof(a)); j++; s=1; for(i=0;i { scanf("%d %d", &x, &y); if(y>r) { s=-1; } else { m= sqrt((double)(r * r - y * y)); a[i].y = x - m; a[i].x = x + m; } } if(s==-1) { printf("Case %d: -1\n", j); continue; } qsort(a,n,sizeof(a[0]),cmp); m=a[0].x; for(i=1;i { if(a[i].y>m) { m=a[i].x; s++; } else if(a[i].x { m=a[i].x; } } printf("Case %d: %d\n", j, s); } return 0; }