• 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;
    }
  • 相关阅读:
    五子棋项目
    判断是否是素数
    双链表
    九九乘法表
    栈和队列
    c排序
    蓝桥杯 接水问题 模拟
    蓝桥杯 调和数列问题
    蓝桥杯 Hanoi问题 递归
    蓝桥杯 排列问题
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/11284943.html
Copyright © 2020-2023  润新知