题目地址:http://poj.org/problem?id=2456
最大化最小值问题。二分牛之间的间距,然后验证。
#include<cstdio>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdbool.h>
#include<time.h>
#include<stdlib.h>
#include<map>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
#define clr(x,y) memset(x,y,sizeof(x))
#define sqr(x) ((x)*(x))
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define LL long long
#define INF 0x3f3f3f3f
#define A first
#define B second
const int N=+;
int n,m,
a[N]; bool check(int d)
{
int last=;
for(int i=;i<m;i++) {
int crt=last+;
while(crt<n && a[crt]-a[last]<d) {
crt++;
}
if(crt==n) return false;
last=crt;
}
return true;
} void solve()
{
sort(a,a+n);
int lb=,ub=INF; while(ub-lb>) {
int mid=(lb+ub)/;
if(check(mid)) {
lb=mid;
} else {
ub=mid;
}
}
printf("%d\n",lb);
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++) {
scanf("%d",&a[i]);
}
solve(); return ;
}