1. 程式人生 > >poj2456 貪心+二分

poj2456 貪心+二分

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?Input* Line 1: Two space-separated integers: N and C 

* Lines 2..N+1: Line i+1 contains an integer stall location, xiOutput* Line 1: One integer: the largest minimum distanceSample Input
5 3
1
2
8
4
9
Sample Output
3
HintOUTPUT DETAILS: 

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3. 

Huge input data,scanf is recommended.

題目大意是讓牛之間的間距最大化,即最大化最小值(同樣最小化最大值也用二分)。

#include <cstdio>
#include <cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[100005];
int n,c;
bool judge(ll x)
{
   int sum=1;
   ll k=a[0];
   for(int i=1;i<n;i++){
    if(a[i]-k>=x)
    {
        k=a[i];
        sum++;
        if(sum>=c)
            return true;
    }
   }
   return false;
}
void solve()
{
    ll right=a[n-1],left=0,mid;
    while(right>=left){//二分法要注意1.循化出口的條件,否則會死迴圈 2.選擇左邊好是右邊的問題;
        mid=(left+right)/2;
        if(judge(mid))
            left=mid+1;
        else
            right=mid-1;
    }
    cout<<left-1<<endl;
}
int main()
{
    scanf("%d %d",&n,&c);
      for(int i=0;i<n;i++)
        scanf("%ld",&a[i]);//一定要用scanf,否則100000的數量級會超時
            sort(a,a+n);//貪心要想到排序。
        solve();
   
    return 0;
}