Virtual Judge POJ 1328 Radar Installation

痞子三分冷 提交于 2019-12-02 13:14:18

贪心

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct Radar {
    double start,end;
} radar[1005];
bool cmp(Radar a,Radar b) {
    return a.start<b.start;
}
int main() {
    int n,d,x,y,m,num,flag;
    double l,r;
    m = 1;
    while(scanf("%d%d",&n,&d)) {
        if(!n && !d)  //如果为0
            break;
        flag = true;
        for(int i = 0; i < n; i++) {
            scanf("%d%d",&x,&y);
            if(y > d)
                flag = false;
            radar[i].start = x - sqrt(d * d - y * y);  //勾股定理
            radar[i].end = x + sqrt(d * d - y * y);  //区间覆盖范围
        }
        if(!flag) {
            printf("Case %d: -1\n",m++);
            continue;
        }
        sort(radar,radar + n,cmp);   //排序  n为岛屿数目
        num = 1,l = radar[0].start,r = radar[0].end;//l和r是double  l为最左端的区间的左端  r为右端
        for(int i = 1; i < n; i++) {
            if(radar[i].start >= l && radar[i].end <= r) { // 某两块区间存在包含关系
                l = radar[i].start;
                r = radar[i].end;
            } else if(radar[i].start <= r && radar[i].end >= r) //某两个区间交叉
                l = radar[i].start;
            else if(radar[i].start > r) { //两个区间没有交集
                l = radar[i].start;
                r = radar[i].end;
                num++;
            }
        }
        printf("Case %d: %d\n",m++,num);
    }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!