题意:
有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;
}