题目描述

陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?

输入输出格式

输入格式:

第一行,两个整数,A,B。(B<=A<=100000)

第二行,A个整数,分别为这A个瓶盖坐标。

输出格式:

仅一个整数,为所求答案。

输入输出样例

输入样例#1: 

5 3
1 2 3 4 5
输出样例#1: 

2

说明

限时3秒

跟跳石子一样

直接二分答案即可

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int MAXN=1e6+;
const int INF=0x7fffffff;
inline char nc()
{
static char buf[MAXN],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,MAXN,stdin))?EOF:*p1++;
}
inline int read()
{
char c=nc();int f=,x=;
while(c<''||c>''){if(c=='-')f=-;c=nc();}
while(c>=''&&c<=''){x=x*+c-'',c=nc();}
return x*f;
}
int a[MAXN],n,m;
int check(int val)
{
int now=a[],nownum=;
for(int i=;i<=n;i++)
if(a[i]-now>=val)
now=a[i],nownum++;
return nownum>=m;
}
int main()
{
#ifdef WIN32
freopen("a.in","r",stdin);
#else
#endif
n=read();m=read();
for(int i=;i<=n;i++) a[i]=read();
sort(a+,a+n+);
int l=,r=INF,ans=;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
return ;
}
05-11 22:19