zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Java运行环境(win10)
    maven封装jar包遇到的问题
    eclipse安装STS遇到的问题
    Redis IO多路复用的理解
    操作系统文章推荐
    jdk1.8新特性
    Maven笔记
    博主推荐
    MySQL文章推荐
    多线程文章推荐
  • 原文地址:https://www.cnblogs.com/yz-lucky77/p/11284943.html
Copyright © 2011-2022 走看看