洛谷 P1316 丢瓶盖

题目描述

陶陶是个贪玩的孩子,他在地上丢了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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值