(跳石头)这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会己经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有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.