题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入输出格式
输入格式:
第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式:
仅一个整数,为所求答案。
输入输出样例
输入样例#1:
5 3
1 2 3 4 5
输出样例#1:
2
说明
限时3秒
分析:
二分答案,然后看能否找到B个瓶盖即可。
代码:
var a:array [1..100000] of longint;
n,b,i,l,r,m,ans:longint;
procedure qsort(l,r:longint);
var i,j,y,z:longint;
begin
i:=l;
j:=r;
z:=a[(l+r) div 2];
repeat
while a[i]<z do inc(i);
while z<a[j] do dec(j);
if not(i>j) then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
function judge(x:longint):boolean;
var i,j,ans,sum:longint;
begin
j:=1;ans:=1;
for i:=1 to n do
begin
if a[i]-a[j]>=x then
begin
j:=i;
inc(ans);
end;
end;
if ans>=b then exit(true);
exit(false);
end;
begin
read(n,b);
for i:=1 to n do
read(a[i]);
qsort(1,n);
l:=1;
r:=a[n]-a[1];
while l<=r do
begin
m:=(l+r) div 2;
if judge(m) then
begin
ans:=m;
l:=m+1;
end
else r:=m-1;
end;
write(ans);
end.