题解:蓝桥云课 364 跳石头
【题目来源】
蓝桥云课:1.跳石头 - 蓝桥云课 (lanqiao.cn)
【题目描述】
一年一度的"跳石头"比赛又要开始了!
这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 \(N\) 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发每一步跳向相邻的岩石,直至到达终点。
为了提高比赛,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃离尽可能长。由于预算限制,组委会至多从起点和终点之间移走M块岩石(不能移走起点和终点的岩石)
【输入】
输入文件第一行包含三个整数 \(L,N,M\),分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。
接下来 \(N\) 行,每行一个整数,第 \(i\) 行的整数 \(D_i(0<D_i<L)\) 表示第 \(i\) 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
【输出】
输出只包含一个整数,即最短跳跃距离的最大值。
【输入样例】
25 5 2
2
11
14
17
21
【输出样例】
4
【算法标签】
《蓝桥云课 364 跳石头》 #2015# #贪心# #NOIP# #二分#
【代码详解】
# 岩石下标 最短跳跃距离
# 0, 2, 11, 14, 17, 21, 25 => 2
#
# 0,11, 14, 17,21, 25 => 3
L, N, M = map(int, input().split())
D = []
for i in range(N):
D.append(int(input()))
#假设最短跳跃距离为x,移除的岩石数量不超过M,则为合法
def check(x):
#cnt表示移除岩石的数量
cnt = 0
#last_idx表示上一个位置
last_idx = 0
for i in range(N):
if D[i] - last_idx >= x:
last_idx = D[i]
else:
cnt += 1
#最后一步的判断
if L-last_idx < x:
return False
return cnt <= M
left, right = 1, L
ans = -1
while left<=right:
mid = (left+right)//2
if check(mid):
ans = mid
left = mid+1
else:
right = mid-1
print(ans)
【运行结果】
25 5 2
2
11
14
17
21
浙公网安备 33010602011771号