ICPC Asia HongKong 2017 E题

题目链接  https://nanti.jisuanke.com/t/40401

看题解说是二分查找+贪心

题意:从 l 个数里选择 s 个数字,使得任意两个数之差绝对值中的最小值最大(有点绕口/挠头)  最大化最小值

做题时我在想怎么选择这 s 个数字,感觉应该要从这些数的中间入手,但是当时不知道该咋办。。。

二分最终的答案,看能不能放完所有的基站

代码如下

也就是说你假设一个答案,通过二分判断基站是否能够建完来判断这个答案是否正确。

#include<iostream>
#include<algorithm>
using namespace std;

int loc[100005];
int n, c;

bool test(int len){
    int p = 0;   //第一个基站放在p[0];
    int q = c-1;

    for(int i=1; i<n; i++){
        if( loc[i] - loc[p] >= len ){   //后面的距离都要至少大于前面的距离
            p = i;
            q--;
            if(q == 0) return true;
        }
    }
    return false;
}

int main() {

    while(cin>>n>>c, n||c){
        for(int i=0; i<n; i++){
                cin>>loc[i];
            }
            sort(loc, loc+n);
            int l = 0;
            int r = location[n-1];
            int mid = 0;

            while(r-l!=1){
                    mid = (l + r)>>1;//除2?
                    if(test(mid)){
                        l = mid;
                    } else {
                        r = mid;
                    }
            }
            cout << l << endl;
    }
    getchar();
    getchar();
    return 0;
}

 

posted @ 2019-08-01 19:57  阳光中的影子  阅读(212)  评论(0编辑  收藏  举报