2020年信奥赛C++提高组csp-s初赛真题及答案解析(阅读程序第2题)

第2题
cpp
1 #include <iostream>
2 #include <cstdlib>
3 using namespace std;
4
5 int n;
6 int d[10000];
7
8 int find(int L, int R, int k) {
9 int x = rand() % (R - L + 1) + L;
10 swap(d[L], d[x]);
11 int a = L + 1, b = R;
12 while (a < b) {
13 while (a < b && d[a] < d[L])
14 ++a;
15 while (a < b && d[b] >= d[L])
16 --b;
17 swap(d[a], d[b]);
18 }
19 if (d[a] < d[L])
20 ++a;
21 if (a - L == k)
22 return d[L];
23 if (a - L < k)
24 return find(a, R, k - (a - L));
25 return find(L + 1, a - 1, k);
26 }
27
28 int main() {
29 int k;
30 cin >> n;
31 cin >> k;
32 for (int i = 0; i < n; ++i)
33 cin >> d[i];
34 cout << find(0, n - 1, k);
35 return 0;
36 }
假设输入的 n,k 和 d[i]都是不超过 10000的正整数,且 k不超过 n,并假设 rand() 函数产生的是均匀的随机数,完成下面的判断题和单选题:
-
判断题
-
第 9行的 x 的数值范围是 L+1 到 R,即 [L+1,R]。( )
A. 正确 B. 错误
-
将第 19 行的
d[a]改为d[b],程序不会发生运行错误。( )A. 正确 B. 错误
-
-
单选题
-
(2.5 分)当输入的 d[i]是严格单调递增 序列时,第 17 行的
swap平均执行次数是( )。A. O(nlogn)
B. O(n)
C. O(logn)
D. O( n 2 n^2 n2)
-
(2.5 分)当输入的 d[i] 是严格单调递减 序列时,第 17 行的
swap平均执行次数是( )。A. O( n 2 n^2 n2)
B. O(n)
C. O(nlogn)
D. O(logn)
-
(2.5 分)若输入的 d[i] 为 i,此程序①平均的时间复杂度和②最坏情况下的时间复杂度分别是( )。
A. O(n) , O( n 2 n^2 n2)
B. O(n) , O(nlogn)
C. O(nlogn) , O( n 2 n^2 n2)
D. O(nlogn) , O(nlogn)
-
(2.5 分)若输入的 d[i] 都为同一个数,此程序平均的时间复杂度是( )。
A. O(n)
B. O(logn)
C. O(nlogn)
D. O( n 2 n^2 n2)
-
判断题答案及解析
- 错误 。第9行的
x = rand() % (R - L + 1) + L,随机数范围是[L, R],包括L,而不是[L+1, R]。 - 正确 。原程序在区间长度为1时,
a = L+1会越界访问;改为d[b]后,b = R = L在合法范围内,避免了运行错误。
单选题答案及解析
- A/B。错题,不随便算一个答案。
- B。对于严格单调递减序列,同理,平均交换次数也为O(n)。
- A 。输入为
i(递增序列)时,平均时间复杂度为O(n),最坏情况(每次选到最小或最大)为O(n²)。 - D。输入全相同时,每次划分只能排除一个元素,递归深度为n,总比较次数为O(n²)。
专栏推荐:信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html
各种学习资料,助力大家一站式学习和提升!!!
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"########## 一站式掌握信奥赛知识! ##########";
cout<<"############# 冲刺信奥赛拿奖! #############";
cout<<"###### 课程购买后永久学习,不受限制! ######";
return 0;
}
1、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html
2、csp信奥赛冲刺一等奖有效刷题题解:
CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
CSP信奥赛C++一等奖通关刷题题单及题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新)
https://blog.csdn.net/weixin_66461496/category_13125089.html
3、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html
4、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}