poj2456

来源:互联网 发布:云计算和大数据哪个好 编辑:程序博客网 时间:2024/06/05 05:56

#include <iostream>
#include <stdio.h>
#include <algorithm>


long long a[100005],n,c;


using namespace std;


bool judge(long long d)
{
     int f,r,t=1;
     f=r=1;
     while (r<n)
     {
         while (a[r]-a[f]<d&&r<n) r++;
         if (a[r]-a[f]>=d) t++;
         f=r;
     }
     if (t>=c) return true;else return false;
}


int main()
{   long long left,right,mid;
    freopen("in.txt","r",stdin);
    cin>>n>>c;
    for (int i=1;i<=n;i++)  scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    left=1;right=a[n]/c;
    while (right-left>1)    /*最后left,right挨在一起*/
    {
         mid=(left+right)/2;
         if (judge(mid)) left=mid;
         else right=mid;
    }
    if (judge(right))cout<<right;else cout<<left;/*对剩下两个分别判断*/
    return 0;
}

题目大意:最大化最小值

FJ 有一个很长的 barn ,然后里面有 N 棚, N 个棚在一条直线上,第 i 个棚的位置为 xi.

然后他有 c 只羊,为了防止羊相互攻击,则要找出最大的两只羊之间距离,前提是这 c 只羊都必须能放下哈。

解题思路:先将 xi 由小到大排序, xn 最大。设这个最大距离为 s;0<s<=(xn-x1)/(c-1), 因为 c 只羊需要 c-1 个间隔。使用二分找 s 的可能取值,然后用贪心看是否成立。

Left=0;

right=(xn-x1)/(c-1);

mid=(left+right)/2; 如果间隔 mid 能够放下 c 只羊,则最大间隔在 [mid,right] ;

否则 [left,mid-1]. 继续寻找。

0 0
原创粉丝点击