二分与贪心-雷达安装问题(算法基础 第9周)

讲解
二分与贪心-雷达安装问题(算法基础 第9周)_第1张图片
二分与贪心-雷达安装问题(算法基础 第9周)_第2张图片
二分与贪心-雷达安装问题(算法基础 第9周)_第3张图片

分析
前面老师讲过使用贪心找到的并不一定是全局最优解,这里也不一定是全局最优解吧?
源码

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;

#define MAXN (1000+10)

//线段两端
struct Node {
    double left, right;
};
int T, n, d;
Node s[MAXN];

//Node按左端点大小排序
bool operator < (const Node& a, const Node& b) {
    return a.left < b.left;
}
//求解每个case
int Solve() {
    int ans;
    double now;
    //按左端点排序
    sort(s, s+n);
    //若当前线段与目前集合中的线段没有公共交点,则新加入一个雷达
    ans = 1; now=s[0].right;
    for (int i=1; i<n; i++) {
        if (s[i].left<=now) {
            now=min(now, s[i].right);
        }
        else {
            ans++;
            now = s[i].right;
        }
    }
    return ans;
}

int main() {
    int x, y;
    bool flag;

    T=0;
    while(1) {
        ++T;
        scanf("%d %d", &n, &d);
        if (n==0 && d==0) {
            break;
        }
        //读入
        flag = true;
        for (int i=0; i<n; i++) {
            scanf("%d %d", &x, &y);
            if (y>d) {
                flag=false;
            }
            else {
                s[i].left = x-sqrt((float)d*d-y*y);
                s[i].right = x+sqrt((float)d*d-y*y);
            }
        }
        //若有小岛距离x轴大于d,则输出-1
        if (flag) {
            printf("Case %d: %d\n", T, Solve());
        }
        else {
            printf("Case %d: -1\n", T);
        }
    }
    return 0;
}

你可能感兴趣的:(二分与贪心-雷达安装问题(算法基础 第9周))