共48道题,当前是第4

初赛真题

在起点和终点之间,有 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。
该段代码是通过二分枚举答案(最短跳跃距离的最大值),并求出满足条件的最大答案。

Question

1.将第 19 行的 fl = 0 改为 fl = l ,程序输出结果必定不变。( )

2.程序执⾏到第 25 行 cout << ans; 时,必有 fl > fr 。( )

3.若第 22 行执行的 check(mid) == l , 则最终的 ans $\leq$ 此时的 mid( )

4.程序执行到第 10 行 if (count > m) return 0; 时, count 的值表示:如果最短跳跃距离恰好为 dis ,那么最少需要移走几块岩石。( )

5.此程序的时间复杂度是( )。

6.若输⼊为: 25 5 2 2 11 14 17 21 则输出为( )。

陈伦制作 版权所无 粤ICP备16127491号-1