poj 2456

最大值最小化,还是不大理解怎么区分,但这个题比较简单,就是不断试出一个最大值

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=100000+10;
long long int a[maxn];
int n,m;
bool cc(int d)
{
    int last=0,cnt;
    for(int i=1;i<m;i++)
    {  cnt=last+1;
       while(cnt<n&&a[cnt]-a[last]<d) cnt++;
       if(cnt==n) return false;//超界了,说明不能铺开m-1个d
       last=cnt;
    }
    return true;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
     sort(a,a+n);
     int l=1,r=a[n-1]-a[0];
     while(l<=r)
     {
         int mid=(l+r)/2;
         if(cc(mid)) l=mid+1;//能铺开据再找一个更大的d,直到找到最大的能铺开的d
            else r=mid-1;
     }
     printf("%d\n",l-1);
    return 0;
}

 

posted on 2017-04-11 18:22  发牌员  阅读(101)  评论(0)    收藏  举报

导航