POJ 2456 Agressive cows

农夫 John 建造了一座很长的畜栏,它包括N (2≤N≤100,000)个隔间,这 些小隔间的位置为x0,...,xN-1 (0≤xi≤1,000,000,000,均为整数,各不相同).

John的C (2≤C≤N)头牛每头分到一个隔间。牛都希望互相离得远点省得 互相打扰。怎样才能使任意两头牛之间的最小距离尽可能的大,这个最 大的最小距离是多少呢

思想:二分,首先把输入的数据进行从小到大排序,再由最短距离为1,最长距离为(a[n-1] - a[0] + 1 - c) / (c - 1) + 1进行二分测试即可

代码:

#include<iostream>
#include<algorithm>
using namespace std;
#define N 100000+5
int a[N];
int main() {
    int n, c;
    scanf("%d%d", &n, &c);
    for(int i = 0; i < n; i++) scanf("%d", &a[i]);
    sort(a, a+n);
      int L = 1, R = (a[n-1] - a[0] + 1 - c)/(c-1) + 1;
      int mid, ans;
      while(L <= R) {
          mid = L + (R - L)/2;
          int i = 1, count = 1, pre = 0;
        while(i < n && count < c) {
            while(i < n && a[i] - a[pre] < mid) i++;
            if(i < n) count++;
            pre = i;
            i++;
        }
        if(count < c) {
            R = mid - 1;        
        } else {
            ans = mid;    
            L = mid + 1;
        }    
    }
    printf("%d\n", ans);
    return 0;
}

 

posted on 2018-08-02 17:52  kindleheart  阅读(293)  评论(0编辑  收藏  举报