Aggressive cows [二分]

Describe

有一个神奇的盒子,它有N (2 <= N <= 1e5)个空间,这些空间依次编号为a1,…,aN (0 <= ai <= 1e9). 有x (2 <= x <= N)巧克力,如果多个巧克力放在一个空间就会爆炸。为了不让巧克力爆炸。我们需要使任意两个巧克力之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?

Input

有多组测试数据,以EOF结束。 第一行:空格分隔的两个整数N和C 第二行——第N+1行:分别指出了ai的位置

Output

每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。

Sample Input

5 3
1
2
8
4
9

Sample Output

3

Hint

1位置放一个巧克力,4位置放一个巧克力,它们的差值为3;最后一个巧克力放在8或9位置都可以,和4位置的差值分别为4、5,和1位置的差值分别为7和8,不比3小,所以最大的最小值为3。
思路:裸的二分,没啥可说

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1e5+5;

int v[maxn];
int n,m;

bool judge(int length) {
    int s = 0,pos = v[1];
    for (int i = 1;i<=n;i++) {
        if(v[i] - pos >= length) {
            s++; pos = v[i];
        }
    }
    if ( s >= m-1 ) return true;
    else return false;
}

int main() {
    while(~scanf("%d %d",&n,&m)){
        for (int i = 1;i<=n;i++) scanf("%d",&v[i]);
        sort(v+1,v+n+1);
        int l = v[1],r = v[n],mid;
        while ( l <= r ) {
            mid = (l+r)>>1;
            if ( judge(mid) ) {
                l = mid+1;
            } else {
                r = mid-1;
            }
        }
        printf("%d\n",l-1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Acer12138/article/details/81783901