POJ-2456
关于这种“最小值最大化"的问题是一种典型的二分思路,步骤如下:
1、将要处理的序列从小到大sort一遍;
2、求出最小值能取值的范围 [ 0,a[n] - a[1]] 。
3、再这个范围内进行二分。
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define N 100010
int a[N];
int main()
{
int n,m,i,l,r;
cin>>n>>m;
for(i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
l = 1;
r = a[n - 1];
m = m - 1;//所需要的牛栏总数减一
while(l<r)
{
int sum =0,t,x;
t = (l+r+1)/2;
x = a[0];//第一个牛栏必选
for(i=1;i<n;i++)
{
if(a[i]-x>=t)
{
x = a[i];
sum++;
}
}
if(sum>=m) l = t;
else r = t - 1;
}
cout<<r<<endl;
return 0;
}