题意:
有N头牛,其中有M头倔牛,要求最大化这M头牛最小距离。
题解:
最大化最小值,二分!对于所有的距离贪心判断这M头牛是否能放下去。
个人认为本题数据有问题,对于M=2的时候,好像~~~没有判定!
因为代码中初始化ub为x[N-1]-x[0]或者x[N-1]-x[0]+1都能AC。显然前者是错误的!
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int N,M;
int x[100005];
bool C(int d)
{
int last=0;
int cur;
for(int i=1;i<M;i++)//放M头倔牛
{
cur=last+1;
while(cur<N&&x[cur]-x[last]<d)
cur++;
if(cur==N)return false;//放到N这个为止,说明这M头牛放不下去!
last=cur;
}
return true;//可以放下去。
}
int main()
{
cin>>N>>M;
for(int i=0;i<N;i++)
scanf("%d",&x[i]);
sort(x,x+N);
int lb=0;int ub=x[N-1]-x[0]+1;//个人认为这个题目数据出问题了,因为没有M=2的特殊情况
while(ub-lb>1)
{
int mid=(ub+lb)/2;
if(C(mid))lb=mid;//可行性解
else ub=mid;
}
cout<<lb;
}