描述
卡皮巴拉要渡过一条河流,在河岸的两边各有一块位置固定的石头,作为起点和终点。
在起点和终点之间,有 N 块岩石(不含起点和终点的岩石)。
卡皮巴拉将从起点出发,每一步跳向相邻的岩石,直至到达终点。
为了增加卡皮巴拉过河的难度,赵老师计划移走一些岩石,使得在跳过河的过程中的最短跳跃距离尽可能长(即实际跳跃过程中的跳跃距离必须 >= 最短跳跃距离)。
但是由于体力有限,赵老师至多从起点和终点之间移走 M 块岩石(注意:不能移走起点和终点的岩石)。
输入描述
输入第一行包含三个整数 L,N<=100000,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及赵老师至多移走的岩石数。
接下来 N 行,每行一个整数,第i行的整数 D
i
(0<D
i
<L)表示第 i 块岩石与起点的距离。
这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。
输出描述
输出只包含一个整数,即最短跳跃距离的最大值。
用例输入 1
25 5 2
2
11
14
17
21
用例输出 1
4
#include <iostream>
#include <vector>
using namespace std;
bool check(int L, int M, const vector<int>& rocks, int minDist) {
int removed = 0;
int lastPos = 0;
for (int i = 0; i < rocks.size(); ++i) {
if (rocks[i] - lastPos < minDist) {
++removed;
} else {
lastPos = rocks[i];
}
}
if (L - lastPos < minDist) {
++removed;
}
return removed <= M;
}
int binarySearch(int L, int M, const vector<int>& rocks) {
int left = 1, right = L;
int result = 0;
while (left <= right) {
int mid = left + (right - left) / 2;
if (check(L, M, rocks, mid)) {
result = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return result;
}
int main() {
int L, N, M;
cin >> L >> N >> M;
vector<int> rocks(N);
for (int i = 0; i < N; ++i) {
cin >> rocks[i];
}
int ans = binarySearch(L, M, rocks);
cout << ans << endl;
return 0;
}
274

被折叠的 条评论
为什么被折叠?



