poj2456 Aggressive cows 二分

Aggressive cows

有一个神奇的盒子,它有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。

思路:

暴力肯定是不行的,时间的话应该只能过O(nlogn)的算法,二分是可以的,于是对最小值二分,如果mid可以,则大于mid的也可能可以,如果mid不可以,那么只能向下找,大于mid的肯定也不行

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = (int)1e5 + 10;
int a[maxn];
int n,m;
bool judge(int x)
{
    int i = 0,cnt = 1;
    for (int j = 1;j < n;j ++)
        if (a[j] - a[i] >= x)
            cnt ++,i = j;
    return cnt >= m;
}
int main()
{
    while (~scanf("%d %d",&n,&m))
    {
        for (int i = 0;i < n;i ++)
            scanf("%d",&a[i]);
        sort(a,a + n);
        int l = 0,r = a[n - 1],mid;
        while (l <= r)
        {
            mid = (l + r) >> 1;
            if (judge(mid))
                l = mid + 1;
            else
                r = mid - 1;
        }
        printf("%d\n",r);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/cloudy_happy/article/details/81868067
今日推荐