题目描述
Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。
他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?
输入输出格式
输入格式:
第1行:两个用空格隔开的数字N和C。
第2~N+1行:每行一个整数,表示每个隔间的坐标。
输出格式:
输出只有一行,即相邻两头牛最大的最近距离。
输入输出样例
输入样例#1:
5 3
1
2
8
4
9
输出样例#1:
3
思路:二分
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define MAXN 100010 using namespace std; int n,c; int l,r,mid; int val[MAXN]; bool judge(){ int pos=c-1,num=val[1]; for(int i=2;i<=n;i++){ if(val[i]-num>=mid) num=val[i],pos--; if(pos==0) return true; } return false; } int main(){ scanf("%d%d",&n,&c); for(int i=1;i<=n;i++) scanf("%d",&val[i]); sort(val+1,val+1+n); l=val[1];r=val[n]; while(l<=r){ mid=(l+r)/2; if(judge()) l=mid+1; else r=mid-1; } cout<<r; }