在起点和终点之间,有 N 块岩石(不含起点和终点的岩⽯)。在⽐赛过程中,选⼿们将从起点出发,每⼀步跳向相邻的岩⽯,直至到达终点。 为了提高比赛难度,组委会计划移⾛⼀些岩石, 使得选⼿们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会⾄多从起点和终点之间移走 M 块岩石(不能移⾛起点和终点的岩石)。
输⼊⽂件第⼀行包含三个正整数 L,N,M ,分别表示起点到终点的距离,起点和终点之间的岩⽯数,以及组委会⾄多移⾛的岩⽯数。 接下来 N 行,每⾏⼀个整数,第 i ⾏的整数 a[i] (0 < a[i] < L) 表示第 i 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同⼀个位置。 输出⽂件只包含⼀个整数,即最短跳跃距离的最⼤值。
01 #include <iostream>
02 using namespace std;
03 int l, n, m, a[50005], ans;
04
05 bool check(int dis) {
06 int count = 0, last = 0;
07 for (int i = 1; i <= n; i++)
08 if (a[i] - last < dis) count++;
09 else last = a[i];
10 if (count > m) return 0;
11 return 1;
12 }
13 int main() {
14 ios::sync_with_stdio(0);
15 cin >> l >> n >> m;
16 for (int i = 1; i <= n; i++)
17 cin >> a[i];
18 a[n + 1] = l;
19 int fl = 0, fr = l;
20 while (fl <= fr) {
21 int mid = (fl + fr) / 2;
22 if (check(mid)) fl = mid + 1, ans = mid;
23 else fr = mid - 1;
24 }
25 cout << ans;
26 return 0;
27 }
1. B。
2. A。
3. B。
4. B。
5. C。
6. B。
该段代码是通过二分枚举答案(最短跳跃距离的最大值),并求出满足条件的最大答案。