poj 1328 贪心

来源:互联网 发布:c语言更相减损术 编辑:程序博客网 时间:2024/06/18 14:48

题意:求可以覆盖海上的所有小岛的雷达的个数。

思路:如果有小岛的y坐标大于雷达半径,则输出‘-1’,结束。否则,对每个小岛,求可覆盖到它的雷达的坐标的区间[left, right],按照left的值对小岛从小到大排序,然后每次取右端最靠左的小岛作为雷达的位置,这样可以覆盖尽量多的其它小岛,当某个小岛的left值也大于了当前雷达的位置,就不得不新增加雷达了,这样直到结束。

我的代码:

1328Accepted200K32MSC++969B

#include <cstdio>#include <cmath>#include <algorithm>using namespace std;struct node{double l, r;//left, right}is[1005];bool cmp(node a, node b){return a.l < b.l;}int main() {int n, d, ncase = 0, x, y;double right;while(scanf("%d%d",&n, &d) && (n || d)){printf("Case %d: ", ++ncase);int num=1, flag = 1, i;for(i = 0; i<n; ++i){scanf("%lf %lf",&x, &y);if(y > d) {flag = 0;//printf("-1\n");//以下两行是我写下的神码,当时脑子真灌水了。//break;//这句让程序排便不通畅。}double temp = sqrt(d * d - y * y);is[i].l = x - temp;is[i].r = x + temp;}getchar();//发现这个写不写都可以,我知道的太少了。sort(is, is + n, cmp);if(!flag) printf("-1\n");for(right = is[0].r, i = 1; i<n; ++i)//forward to right{if(right > is[i].r) {right = is[i].r;}else if(right < is[i].l){num ++;right = is[i].r;}}if(flag) printf("%d\n", num);}return 0;}