题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入格式
第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式
仅一个整数,为所求答案。
一道练习二分的经典例题
#include<iostream> #include<cstdio> #include<algorithm> #define ll long long using namespace std; ll f[100001];ll a,b; bool check(ll x) { ll ans=0,last=-(1<<30); for(int i=1;i<=a;i++) { if(f[i]-last>=x) { // cout<<i<<" "; last=f[i]; ans++; if(ans>=b)return 1; } } return 0; } int main() { cin>>a>>b; ll ansmax=0; for(int i=1;i<=a;i++) { scanf("%lld",&f[i]); ansmax=max(ansmax,f[i]); } sort(f+1,f+a+1); ll l=0,r=ansmax+1; ll ans=0; while(l<=r) { ll mid=(l+r)/2; if(check(mid)) { l=mid+1; ans=max(ans,mid); } else r=mid-1; } cout<<ans; }