POJ1328(贪心)
题目大意:x轴为河岸,给出小岛坐标,在河岸上建探测范围一定雷达,要求覆盖所有小岛,求雷达的最小个数。
分析:以小岛为圆心,探测半径画圆,与x轴交于ai,bi,求出所有区间并排序,如果两个区间有重叠,则可覆盖,将bi更新为b(i-1)即可。
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; struct xy { int x; int y; }point[1000]; struct l { double begin; double end; }length[1005]; int cmp(l a, l b) { return a.begin < b.begin; } int main() { int n, k,num=0; while (scanf("%d%d", &n, &k) != EOF&&n&&k) { int sum = 1,flag=0; for (int i = 0; i < n; i++) { scanf("%d%d", &point[i].x, &point[i].y); } for (int i = 0; i < n; i++) { if (k < abs(point[i].y)) { flag = 1; break; } double t = sqrt(k*k*1.0- point[i].y*point[i].y*1.0); length[i].begin = point[i].x *1.0- t; length[i].end = point[i].x*1.0 + t; } if (flag == 1) { printf("Case %d: -1\n", ++num); continue; } sort(length, length + n, cmp); for (int i = 0; i < n - 1; i++) { if (length[i].end >= length[i + 1].begin) { length[i + 1].end = length[i].end; continue; } sum++; } num++; printf("Case %d: %d\n", num,sum); } return 0; }