正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2022 第一轮真题 › 第25题
CSP-S 2022 第一轮 第25题:当输入为“5398 2691 3746”时,程序第一次执行到第36行,va1[]
题目
1 #include <iostream>
2
3 using namespace std;
4
5 const int MAXN = 105;
6
7 int n, m, k, val[MAXN];
8 int temp[MAXN], cnt[MAXN];
9
10 void init()
11 {
12 cin >> n >> k;
13 for (int i = 0; i < n; i++) cin >> val[i];
14 int maximum = val[0];
15 for (int i = 1; i < n; i++)
16 if (val[i] > maximum) maximum = val[i];
17 m = 1;
18 while (maximum >= k) {
19 maximum /= k;
20 m++;
21 }
22 }
23
24 void solve()
25 {
26 int base = 1;
27 for (int i = 0; i < m; i++) {
28 for (int j = 0; j < k; j++) cnt[j] = 0;
29 for (int j = 0; j < n; j++) cnt[val[j] / base % k]++;
30 for (int j = 1; j < k; j++) cnt[j] += cnt[j - 1];
31 for (int j = n - 1; j >= 0; j--) {
32 temp[cnt[val[j] / base % k] - 1] = val[j];
33 cnt[val[j] / base % k]--;
34 }
35 for (int j = 0; j < n; j++) val[j] = temp[j];
36 base *= k;
37 }
38 }
39
40 int main()
41 {
42 init();
43 solve();
44 for (int i = 0; i < n; i++) cout << val[i] << ;
45 cout << endl;
46 return 0;
47 }
假设输入的 n 为不大于 100 的正整数,k 为不小于 2 且不大于 100 的正整数,val[i]在 int 表示范围内,完成下面的判断题和单选题:本小题
当输入为“5 3 98 26 91 37 46”时,程序第一次执行到第 36 行,val[]数组的内容依次为( )。
选项
- A. 91 26 46 37 98
- B. 91 46 37 26 98
- C. 98 26 46 91 37
- D. 91 37 46 98 26
答案
D
题解
答案选 D:91 37 46 98 26。
输入中,n = 5、k = 3,初始数组为: ``text 98 26 91 37 46 ``
第一次循环时,base = 1,第 29~34 行按照 val[j] / base % k,也就是 除以 3 的余数,将元素从小到大排列:
| 元素 | 98 | 26 | 91 | 37 | 46 |
|---|---|---|---|---|---|
| 除以 3 的余数 | 2 | 2 | 1 | 1 | 1 |
余数相同的元素会保持原来的先后顺序。这是因为第 31 行从后往前遍历,每放入一个元素,相应的放置位置就向前移动一位。
所以排序结果为:
- 余数为 1:
91 37 46 - 余数为 2:
98 26
第 35 行把结果复制回 val[],因此第一次执行到第 36 行时,数组内容是 91 37 46 98 26。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号