不是VIP会员,不能显示答案

题目解答

题目:
(跳石头)这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会己经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有N块岩石(不含起
点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点到终点之间移走M块岩石(不能移走起点和终点的岩石)。
输入第一行包含三个整数L,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。
接下来一行,N个整数,第i个整数Di(0<Di<L)表示第i块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
【样例输入】
25 5 2
2 11 14 17 21
【样例输出】
4
将与起点距离为2和14的两个岩石移走后,最短的跳跃距离为4 (从与起点距离17的岩石跳到距离21的岩石,或者从距离21的岩石跳到终点)。
算法:由于答案是线性的,可以二分枚举最终答案,再每次验证答案的正确性,从而逼近直到确定最终的最长距离。
var
  d:array[0..100005] of longint; 
  i,Len,n,m,l,r,mid:longint;
function check(ans:longint):boolean;//判断 ans 是否为可行的答案 
var
  i,last,tot:longint; 
begin
  last:=0; tot:=0; 
  for i:=1 to n do
    if (d[i]-last>=ans) then last:=d[i]
    else  inc(tot) ;
  if Len-last<ans then inc(tot);   
  if (tot<=m) then exit ( true )
  else exit(false);
end;
 
begin
  readln(Len,n,m);
  for i:=1 to n do read(d[i]);
  d[n+1]:=Len;
  l:=0; r:=len; 
  while l<r do
  begin
    mid:=  (l+r+1) div 2 ;
    if (check(mid)) then l:=mid
    else r:=  mid-1  ;
  end;
  writeln(l);
end.
考点:
分析:
解答:
评论:
老师: