題目描述
陶陶是個貪玩的孩子,他在地上丟了A個瓶蓋,爲了簡化問題,我們可以當作這A個瓶蓋丟在一條直線上,現在他想從這些瓶蓋裏找出B個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?
輸入輸出格式
輸入格式:
第一行,兩個整數,A,B。(B<=A<=100000)
第二行,A個整數,分別爲這A個瓶蓋座標。
輸出格式:
僅一個整數,爲所求答案。
輸入輸出樣例
輸入樣例#1:
5 3
1 2 3 4 5
輸出樣例#1:
2
說明
限時3秒
終於找到一個心儀的、不容易寫錯的二分答案模板了,ans在二分中同時保存。
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=100005;
int n,m;
int a[MAXN];
bool check(long long x){
int sum=a[1],cnt=1;
for(int i=2;i<=n;i++){
if(a[i]-sum>=x) sum=a[i],cnt++;
}
return cnt>=m;
}
int main(){
cin>>n>>m;
long long l=0,r=1152921504606846976,mid;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int ans;
while(l<=r){
mid=(l+r)/2;
if(check(mid)) l=mid+1,ans=mid;
else r=mid-1;
}
cout<<ans<<endl;
return 0;
}