题目描述
地上有N个石子排成了一条直线,小科想从这N个石子中挑出M个,小科希望挑出的M个石子中距离最小的两个石子的距离尽量的大,请你帮他计算这个最大值是多少。
输入格式
第一行,两个整数, N,M。(2<=M<=N<=100000)
第二行,N个正整数ai,分别表示N个石子的坐标, (1 <= ai <= 10^9)
输出格式
一个整数,最小距离的最大值。
输入输出样例
输入样例1:
5 3 1 2 3 4 5
输出样例1:
2
【耗时限制】1000ms 【内存限制】128MB
#include<bits/stdc++.h>
# define N 100010
using namespace std;
int n,m,a[N];
bool check(int x){
int cnt=1,pre=a[1];
for(int i=2;i<=n;i++){
if(a[i]-pre>=x){
cnt++;
pre=a[i];
}
}
return cnt>=m;
}
int up(int l,int r){
while(l<r){
int mid=(l+r)/2;
if(check(mid)){
l=mid+1;
}
else{
r=mid;
}
}
return l;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
cout<<up(1,a[n]+1)-1;
return 0;
}