POJ-2456(二分+贪心)

题意:
    有n个牛栏,选m个放进牛,相当于一条线段上有 n 个点,选取 m 个点,
使得相邻点之间的最小距离值最大

思路:贪心+二分
二分枚举相邻两牛的间距,判断大于等于此间距下能否放进所有的牛。

#include<iostream>
#include<algorithm>
#include<cstdio>
#define max 100005
using namespace std;
int n,c,a[max];
bool judge(int d) {
    int index = 0, num=1;
    for(int i=1;i<n;i++){
        if(a[i]-a[index]>=d){
            index = i;
            num++;
        } 
        if(num>=c) return true;
    } 
    return false;
}
int main() {

    while(scanf("%d%d",&n,&c)!=EOF) {
        for(int i=0; i<n; i++) {
            scanf("%d",&a[i]);
        }
        sort(a,a+n);
        int l,r,ans;
        l = 1; r = a[n-1]-a[0]; ans = 0;
        while(l<=r) {
            int mid = (l+r)>>1;
            if(judge(mid)) {
                ans = mid;
                l = mid+1;
            } else {
                r = mid -1;
            }
        }
        cout<<ans<<endl;
    }

    return 0;
}

 

posted @ 2019-09-29 12:10  七忆鱼  阅读(107)  评论(0编辑  收藏  举报