1. 题目解析与核心思路
这道题目来自NOIP 2015提高组的跳石头问题,考察的是二分答案与贪心算法的结合应用。题目大意是:在一条长度为L的河上,有N块石头(不包括起点和终点),我们需要移走最多M块石头,使得所有相邻石头之间的最小距离尽可能大。
1.1 关键概念理解
首先必须明确题目要求的是"最短跳跃距离的最大值"。这个表述看似矛盾,实则精妙:
- "最短跳跃距离"指的是在所有相邻石头的间距中取最小值
- "最大值"表示我们要通过移除石头的方式,让这个最小值尽可能大
举例说明:
- 原始石头位置:0(起点), 3, 5, 7, 10(终点)
- 原始间距:3, 2, 2, 3
- 最短跳跃距离:2
- 移除5和7两块石头后间距:3, 7
- 新的最短跳跃距离:3(这就是我们要的最大化目标)
1.2 算法选择依据
为什么选择二分答案+贪心的组合?
-
二分答案适用性:
- 答案具有单调性:如果x可行,那么所有小于x的值都可行
- 答案范围明确:最小可能0,最大可能L(全部移除中间石头)
- 验证答案相对容易(用贪心算法)
-
贪心验证的优势:
- 线性扫描即可验证
- 局部最优能保证全局最优(因为移除石头不影响后续决策)
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二分答案实现细节
2.1 二分框架搭建
标准的二分查找需要确定三个要素:
- 查找范围[left, right)
- 终止条件
- 移动规则
对于本题:
java复制int left = 0;
int right = L + 1; // 开区间
while (left + 1 < right) {
int mid = left + (right - left) / 2;
if (check(mid, m, dis)) {
left = mid; // 尝试更大的值
} else {
right = mid; // 尝试更小的值
}
}
// 最终left就是答案
注意right初始化为L+1的原因:确保当答案是L时也能被包含在搜索范围内。因为我们的二分是左闭右开区间。
2.2 边界条件处理
几个关键边界需要特别注意:
- 起点和
