BZOJ1734: [Usaco2005 feb]Aggressive cows 憤怒的牛 二分查找

Description
Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,…,xN (0 <= xi <= 1,000,000,000). His C (2 <= C <= N) cows don’t like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?

農夫 John 建造了一座很長的畜欄,它包括NN (2 <= N <= 100,000)個隔間,這些小隔間依次編號爲x1,…,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)頭牛們並不喜歡這種佈局,而且幾頭牛放在一個隔間裏,他們就要發生爭鬥。爲了不讓牛互相傷害。John決定自己給牛分配隔間,使任意兩頭牛之間的最小 距離儘可能的大,那麼,這個最大的最小距離是什麼呢

Input
* Line 1: Two space-separated integers: N and C * Lines 2..N+1: Line i+1 contains an integer stall location, xi

第一行:空格分隔的兩個整數N和C

第二行—第N+1行:i+1行指出了xi的位置

Output
* Line 1: One integer: the largest minimum distance

第一行:一個整數,最大的最小值

Sample Input
5 3
1
2
8
4
9

Sample Output
3

把牛放在1,4,8這樣最小距離是3
HINT
Source
Gold

**題解:
二分答案,進行判斷**

#include <iostream>
#include <cstdio>
#include <algorithm> 
using namespace std;
const int MAXN=100000+1;
int a[MAXN];
int main(int argc, char *argv[])
{
    //freopen("b.in","r",stdin);
    //freopen("b.out","w",stdout); 
    int n,m,i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;i++)
    scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    int l=0,r=a[n],mid;
    while(l<r)
    {
        mid=(l+r)/2;
        long long tot=0,ans=0;
        for(i=2;i<=n;i++)
        if(tot+a[i]-a[i-1]<=mid) tot=tot+a[i]-a[i-1];
        else tot=0,ans++;
        if(ans<m-1) r=mid;
        else l=mid+1;
    }
    printf("%d\n",l);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章