这是挑战程序设计上的题,我看了代码还是没有发现哪里错了,其实是判断的时候多算了一次,只用m-1次就行了
这题让找到最大的最小距离,不断地根据是否满足条件来二分。
对于每一头牛,都要满足与前一头牛的距离大于当前的d;
但是判断的时候只需要进行m-1次判断;
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int stall[100005],m,n;
bool isc(int d)
{
int last=0,now;
for(int i=1;i<m;i++)//只需要m-1次的判断
{
now=last+1;
while(now<n&&(stall[now]-stall[last])<d)
{
now++;
}
if(now==n)return false;//没有空位了,表示这种情况不行
last=now;//last变为这次的now
}
return true;
}
int main()
{
int i;
while(scanf("%d%d",&n,&m)==2)
{
for(i=0;i<n;i++)
scanf("%d",&stall[i]);
sort(stall,stall+n);
int lb=0,ub=1000000005,mid;
while(ub-lb>1)
{
mid=(ub+lb)/2;
if(isc(mid))lb=mid;
else ub=mid;
}
printf("%d\n",lb);
}
return 0;
}