分析
二分答案,其实就是丢瓶盖,最小值最大
具体请看http://blog.csdn.net/sugar_free_mint/article/details/79114637
然后其实道理是相通的。
最小值:最小距离 最大值:最大距离
检验部分:看能拿几个瓶盖
代码
#include <cstdio>
#include <algorithm>
#define A ((1<<30)-1)*2+1
using namespace std;
int l=A,n,m,r,a[100001];
bool check(int mid){
int s=0,bit=a[1];
for (int i=2;i<=n;i++){
if (a[i]-bit>=mid) s++,bit=a[i];
if (s>=m) return true;
}
if (s+1<m) return false; else return true;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
sort(a+1,a+1+n); r=a[n]-a[1];
for (int i=2;i<=n;i++) l=min(l,a[i]-a[i-1]);
while (l<=r){
int mid=(l+r)>>1;
if (check(mid)) l=mid+1;
else r=mid-1;
}
printf("%d",r);
}