POJ2456(二分/最大化最小值)

声乐考核没叔,?nsl,我已经等了半个小时侥幸者了说散就散来了快看!!
mmp您怎么唱成这个样子?我吹不动了,给钱
希望十点之前我可以改掉上面这句话

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?

Input

  • Line 1: Two space-separated integers: N and C

  • Lines 2…N+1: Line i+1 contains an integer stall location, xi

Output

  • Line 1: One integer: the largest minimum distance

Sample Input

5 3
1
2
8
4
9

Sample Output

3

Solution

二分枚举区间,然后贪心就完事了
需要注意的地方:
·开long long
·从第二个开始贪心
·注意把mid定义在外面
没了

AC代码

#include
#include
#include
#include
#define ll long long
using namespace std;
int n,c;
//int arr;
ll a[100005];
bool judge(ll s)
{
    ll step=1;
    ll start=a[1];
    //int end=start+s;
    for(ll i=2;i<=n;++i)
    {
        if(a[i]-start>=+s)
        {
            start=a[i];
            ++step;
            //printf("//%d %d\n",start,end);
        }
    }
    return step>=c;
}
int main()
{
    while(~scanf("%d %d",&n,&c))
    {
        for(int i=1;i<=n;++i)
        {
            scanf("%lld",&a[i]);
        }
        sort(a+1,a+1+n);
        //arr=a[n];
        //int ans;
        ll up=a[n];
        ll down=0;
        ll mid;
        while((up-down)>1)
        {
            mid=(up+down)/2;
            //printf("%d\n%d %d\n",mid,up,down);
            if(judge(mid)==1)
            {
                down=mid;
            }
            else up=mid;
            //ans=mid;
        }
        printf("%lld\n",up-1);
    }
    return 0;
}

你可能感兴趣的:(贪心,poj)