题解:蓝桥云课 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
posted @ 2026-03-04 15:11  团爸讲算法  阅读(0)  评论(0)    收藏  举报