SPOJ - AGGRCOW Aggressive cows(二分枚举最优解)

题意:给出n个位置,需要将m头牛放在这些位置中,使得所有相邻两头牛间的最小距离最大,求最大的最小距离;

思路:二分枚举最优解。先将所有位置排序,从最大总距离枚举到0,若满足差值大于等于枚举值的位置个数大于等于m,则当前枚举值为最优解。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t,n,m;
int num[500100];
int a[500100];
int judge(int x)
{
    int cnt=1,temp=num[0];
    for(int i=1;i<n;i++)
    {
        if(num[i]-temp>=x)
        {
            cnt++;
            if(cnt>=m) return 1;
            temp=num[i];
        }
    }
    return 0;
}
int binary()
{
    int l=0,r=num[n-1]-num[0];
    while(l<=r)
    {
        int mid=(l+r)/2;
        if(judge(mid)) l=mid+1;
        else r=mid-1;
    }
    return l-1;
}
int main()
{
    int i,j,k;
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            memset(num,0,sizeof(num));
            scanf("%d%d",&n,&m);
            for(i=0;i<n;i++)
            {
                scanf("%d",&num[i]);
            }
            sort(num,num+n);
            printf("%d\n",binary());
        }
    }

}

 

posted on 2015-07-12 23:17  大树置林  阅读(308)  评论(0编辑  收藏  举报

导航