• ACM 疯牛


    疯牛

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).
    但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?
     
    输入
    有多组测试数据,以EOF结束。
    第一行:空格分隔的两个整数N和C
    第二行——第N+1行:分别指出了xi的位置
    输出
    每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。
    样例输入
    5 3
    1
    2
    8
    4
    9
    样例输出
    3

    二分搜索+贪心
    主要对所求最大的最小距离进行二分搜索,看其是否满足条件
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
    
    bool judge(vector<int>& x, int c, int value){
        int cnt = 1,pre = x[0];
        for(int i = 1; i < x.size(); ++ i){
            if(x[i]-pre >= value){
                cnt ++ ;
                pre = x[i];
            }
            if(cnt >= c) return true;
        }
        return false;
    }
    
    int solve(vector<int>& x, int c){
        int left = 0, right =x.back() - x.front();
        while(left <= right){
            int mid = (left+right)/2;
            if(judge(x,c,mid)) left = mid+1;
            else right = mid-1;
        }
        return left-1;
    }
    
    int main(){
        int n,c;
        while(cin >> n >> c){
            vector<int> x(n);
            for(int i = 0 ; i < n; ++ i)
                cin >>  x[i];
            sort(x.begin(),x.end());
            cout<<solve(x, c)<<endl;
        }
    }
    
    
    
     
  • 相关阅读:
    转载:configure生成的文件(1.5.3)《深入理解Nginx》(陶辉)
    现场管理
    02 表扫描
    01 成本的含义
    16 计划稳定性与控制
    14 事务处理
    13 SELECT 以外的内容
    12 索引
    11 半联结 & 反联结
    08 分析函数
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3663041.html
Copyright © 2020-2023  润新知