zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
    
    
     
  • 相关阅读:

    快排
    排序算法
    运算符
    二叉树
    递归
    队列
    栈(没写完)
    绘制双坐标轴的图形3-不同的plot类型
    绘制双坐标轴的图形2-不同的plot类型
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3663041.html
Copyright © 2011-2022 走看看