正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2022 第一轮真题 › 第38题
CSP-S 2022 第一轮 第38题:完善程序(第 19 题)第 5 空
题目
三 完善程序(单选题,每小题 3 分,共计 30 分)
(1)(归并第 k 小) 已知两个长度均为 n 的有序数组 a1 和 a2(均为递增序,但不保证严 格单调递增),并且给定正整数 k(1≤k≤2n),求数组 a1 和 a2 归并排序后的数组里 第 k 小的数值。
试补全程序。
#include <bits/stdc++.h>
using namespace std;
int solve(int *a1, int *a2, int n, int k) {
int left1 = 0, right1 = n - 1;
int left2 = 0, right2 = n - 1;
while (left1 <= right1 && left2 <= right2) {
int m1 = (left1 + right1) >> 1;
int m2 = (left2 + right2) >> 1;
int cnt = ①;
if (②) {
if (cnt < k) left1 = m1 + 1;
else right2 = m2 - 1;
} else {
if (cnt < k) left2 = m2 + 1;
else right1 = m1 - 1;
}
}
if (③) {
if (left1 == 0) {
return a2[k - 1];
} else {
int x = a1[left1 - 1], ④;
return std::max(x, y);
}
} else {
if (left2 == 0) {
return a1[k - 1];
} else {
int x = a2[left2 - 1], ⑤;
return std:: max(x, y);
}
}
}本小题
⑤处应填( )
选项
- A. y = a1[k - left2 - 1]
- B. y = a1[k - left2]
- C. y = a2[k - left1 - 1]
- D. y = a2[k - left1]
答案
A
题解
答案选 A:y = a1[k - left2 - 1]。
这里数组下标从 0 开始。进入这段分支时,第 \(k\) 小的数可以看作以下两部分中最大的数:
a2的前left2个数,最大值是a2[left2 - 1],已经赋给x;a1的前k - left2个数,最大值是a1[k - left2 - 1],应赋给y。
两部分共计 \(k\) 个数,因此返回 max(x, y)。
例如,\(k=5\)、left2=2,就需要取 a2 的前 2 个和 a1 的前 3 个,比较 a2[1] 与 a1[2]。后者下标正是 \(5-2-1=2\)。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号