题目
Farmer John 建造了一个有N(2≤N≤105) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是(0≤≤)。
他的C(2≤C≤N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入输出格式
输入格式
第1行:两个用空格隔开的数字N和C。
第2∼N+1行:每行一个整数,表示每个隔间的坐标。
输出格式
输出只有一行,即相邻两头牛最大的最近距离。
输入输出样例
输入样例
5 3
1
2
8
4
9
输出样例
3
解析
这道题目还是按照套路构造条件,可以把c头牛全部安置进这些隔间使相邻两头牛距离不超过x。于是先得检验单调性:可以看出,x越小,就越可能把所有牛合法安置;当x比较大时,牛棚就不够安置了。于是不难想象,存在一个分界线ans,x大于ans时没有合法安置方案,x小于等于ans时,则一定存在合法安置方案。
此题目只有一个限制,即任意两个相邻安置点距离不能小于x。于是可以采用感受到一种贪心算法:从最左端开始,每隔超过x的距离,能安置就安置,最后只要看遍历所有点以后总共安置了多少头牛即可。
#include<iostream>
#include<algorithm>
#define maxn 1000010
#define inf 1e9
using namespace std;
int a[maxn],n,c;
bool p(int d){
int k=0,last=-inf;//last记录上一头牛的安置坐标
for(int i=1;i<=n;i++){
if(a[i]-last>=d){//能安置就立刻安置
last=a[i];
k++;
}
}
return k>=c;
}
int main(){
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
int l=0,r=inf,ans,mid;
while(l<=r){
if(p(mid=l+r>>1)){
ans=mid;
l=mid+1;
}
else{
r=mid-1;
}
}
cout<<ans;
return 0;
}