POJ 1328 Radar Installation 贪心(区间选点)

来源:互联网 发布:c语言函数声明的标准 编辑:程序博客网 时间:2024/06/08 18:28
区间选点问题,坑点 一个是double类型,2是y > d|| d < 0要考虑到,3是要按照左端点进行升序排序,4是算法核心内容,如果选取的cou作为雷达位置,那么从下一个区间开始选点,如果下一个区间的右端点比小于等于cou,那么让cou = 这个区间的右端点,如果下一个区间的左端点大于cou,那么再重新安装一个雷达,让雷达安放在这个区间的右端点上。
#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <math.h>using namespace std;struct node{    double u;    double v;}a[1123];bool cmp(node a, node b){    return a.u < b.u;}int main(){    int n, d;    int i;    double x, y;    int count = 1;    while(cin >> n >> d){        if(n == 0 && d == 0)            break;        int flag = false;        for(i = 0;i < n;i++){            cin >> x >> y;            if(y > d || d < 0){                flag = true;            }            a[i].u = x-sqrt(d*d - y*y);            a[i].v = x+sqrt(d*d - y*y);        }        if(!flag){            int cnt;            double cou;            sort(a,a+n,cmp);            cnt = 1;            cou = a[0].v;            for(i = 1;i < n;i++){                if(a[i].v <= cou){                    cou = a[i].v;                }else if(a[i].u > cou){                    cnt++;                    cou = a[i].v;                }            }            printf("Case %d: %d\n", count, cnt);        }else {            printf("Case %d: -1\n", count);        }        count++;    }    return 0;}

0 0
原创粉丝点击