poj1328 Radar Installation —— 贪心
题目链接:http://poj.org/problem?id=1328
题解:区间选点类的题目,求用最少的点以使得每个范围都有点存在。以每个点为圆心,r0为半径,作圆。在x轴上的弦即为雷达可放置的范围。这个范围可用勾股定理求得。记录每个点的范围,然后排序,贪心。
(由于不熟悉qsort的用法,折腾了一个小时。后来清晰了:qsort 的cmp是通过正负判断(但结构体又不是),而sort的cmp是通过对错判断,即0或1。所以qsort的cmp用‘-’(结构体除外),sort的cmp用‘<’和‘>’判断,决定以后用sort,要加上<algorithem> 和 std。
代码如下:
#include<cstdio>//poj 1328 贪心 #include<cmath> #include<cstdlib> #include<cstring> typedef struct { double l,r; }edge, *E; edge e[1010]; int cmp(const void *a, const void*b) { return ((E)a)->r > ((E)b)->r?1:-1; } int solve(int n) { int sum = 1; double brim = e[0].r; for(int i = 1; i<n; i++) { if(brim<e[i].l) { brim = e[i].r; sum ++; } } return sum; } int main() { int n,B,t = 0; double r0,x,y,r; while(scanf("%d %lf",&n,&r0) && (n||r0)) { B = 1; for(int i = 0; i<n; i++) { scanf("%lf %lf",&x,&y); if(y>r0) B = 0; r = sqrt(r0*r0-y*y); e[i].l = x - r; e[i].r = x + r; } if(B) { qsort(e,n,sizeof(e[0]),cmp); printf("Case %d: %d\n",++t,solve(n)); } else printf("Case %d: -1\n",++t); } return 0; }