题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入输出格式
输入格式:第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式:仅一个整数,为所求答案。
输入输出样例
说明
限时3秒
题目分析:最大值的最小化问题,注意搜索边界的判定,如果是求最大值则其解的范围在[mid,right]内,如果是求最小值则其解的范围在[left,mid]内,以此来缩小搜索区间。
#include<bits/stdc++.h>
using namespace std;
int a[100010];
int n,m;//分别表示扔的数量和拿的数量
bool solve(int x){
int ans=1,last=a[0];
for(int i=1;i<n;i++){
if(a[i]-last>x){
ans++;
last=a[i];
}
}
if(ans>=m) return 1;
else return 0;
}
int main(){
while(~scanf("%d%d",&n,&m)){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);//按位置排序
int le=0,ri=a[n-1]-a[0];//确定搜索边界
while(le<ri){
int mid=(le+ri)/2;
if(solve(mid)){
le=mid+1;
}
else ri=mid;
}
printf("%d\n",le);
}
return 0;
}