#953. 普及组CSP-J2025初赛模拟卷5
普及组CSP-J2025初赛模拟卷5
一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
{{ select(1) }}
- 十进制数2025的十六进制表示是( )。
- A. 07D9
- B. 07E9
- C. 07F9
- D. 07F1
{{ select(2) }} 2. 以下关于计算机竞赛IOI的描述正确的是( )。
- A. IOI非英语国家参赛选手可以在比赛中携带电子词典
- B. IOI参赛选手可携带已关机的手机放在自己座位后面的包里
- C. IOI参赛选手在比赛时间内去厕所的时候可携带手机
- D. IOI全称是国际信息学奥林匹克竞赛
{{ select(3) }} 3. 以下不能用ASCII码表示的字符是( )。
- A. @
- B. ①
- C. ^
- D. ~
{{ select(4) }} 4. 设变量s为double型且已赋值,下列哪条语句能将s中的数值保留到小数点后一位,并将第二位四舍五入?( )
- A. s=(x*10+0.5)/10.0
- B. s=s*10+0.5/10.0
- C. s=(s/10+0.5)*10.0
- D. s=(int)(s*10+0.5)/10.0
{{ select(5) }} 5. 以下不属于STL链表中的函数的是( )。
- A. sort
- B. empty
- C. push_back
- D. resize
{{ select(6) }} 6. 小明写了一个程序,在这里用到的数据结构是( )。
#include <iostream>
using namespace std;
int k;
int f(int a)
{
if(a-k>0&&(a-k)%2==0)
return f((a+k)/2)+f((a-k)/2);
else
return 1;
int main( ) {
int n;
cin>>n>>k;
if((n+k)%1) f
cout<<1<<endl;
return 0;
}
cout<<f(n);
return 0;
}
- A. 树
- B. 栈
- C. 链表
- D. 队列
{{ select(7) }} 7. 小明想求n个不同正整数的全排列,他设计的程序采用DFS方法的时间复杂度是( )。
- A. O(logn)
- B. O(n!)
- C. O(n²)
- D. O(nlogn)
{{ select(8) }} 8. 在下列排序算法中,( )是不稳定的排序算法。
- A. 归并排序
- B. 插入排序
- C. 选择排序
- D. 冒泡排序
{{ select(9) }} 9. 一台32位操作系统的计算机运行C++,下列说法中错误的是( )。
- A. double类型的变量占用8字节内存空间
- B. bool类型的变量占用1字节内存空间
- C. long long类型变量的取值范围比int类型变量的大一倍
- D. char类型的变量也可以作为循环变量
{{ select(10) }} 10. 若整型变量n的值为25,则表达式n&(n+1>>1)的值是( )。 - A. 25 - B. 26 - C. 9 - D. 16
{{ select(11) }} 11. 一群学生参加学科夏令营,每名同学至少参加一个学科的考试。已知有100名学生参加了数学考试,50名学生参加了物理考试,48名学生参加了化学考试,学生总数是参加至少两门考试学生的两倍,也是参加三门考试学生数的三倍,则学生总数为( )。 - A. 90 - B. 96 - C. 108 - D. 120
{{ select(12) }} 12. 以下不是C++中的循环语句的是( )。 - A. while - B. do...while - C. for - D. switch..case
{{ select(13) }} 13. 二叉树T,已知其后序遍历序列为4275631,中序遍历序列为4215736,则其前序遍历序列为( )。 - A. 1257634 - B. 1243576 - C. 1427536 - D. 1472356
{{ select(14) }} 14. 一个六位数是完全平方数,且最后三位数字都是4,这样的六位数有( )个。 - A. 2 - B. 3 - C. 4 - D. 5
{{ select(15) }} 15. 用三种颜色给1x4的长方形方格区域涂色,在每种颜色至少用1次的前提下,相邻方格不涂同一种颜色的概率为( )。 - A. 1/3 - B. 2/3 - C. 1/2 - D. 4/9
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填×;除特殊说明外,判断题每题1.5分,选择题每题3分,共计40分)
(1)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int solve(vector<int> nums) {
05 map<int, int> cnt;
06 int tot = 0;
07 for (auto v : nums) {
08 cnt[v]++;
09 tot += v;
10 }
11 int ans = -1E5;
12 for (auto v : nums) {
13 cnt[v]--;
14 if ((tot - v) % 2 == 0 && cnt[(tot - v) / 2] > 0)
15 ans = max(ans, v);
16 cnt[v]++;
17 }
18 return ans;
19 }
20
21 int main() {
22 int n;
23 cin >> n;
24 vector<int> a(n);
25 for (int i = 0; i < n; i++)
26 cin >> a[i];
27 cout << solve(a) << endl;
28 return 0;
29 }
判断题
{{ select(16) }} 16. 若程序输入5 -2 -1 -3 -6 4,则程序输出4。( )
{{ select(17) }} 17. 对于第17行的代码,如果不判断(tot-v)%2==0,则程序依然可以得到正确的结果。( )
{{ select(18) }} 18. 若将头文件<bits/stdc++.h>换为,程序依然可以正常运行。( )
选择题
{{ select(19) }} 19. 若输入8 6 -31 50 -35 41 37 -42 13,则输出是( )。 - A. 13 - B. -35 - C. -31 - D. -100000
{{ select(20) }} 20. 如果去除第19行的代码,对于输入4 2 3 5 10,输出是( )。 - A. 2 - B. 5 - C. 10 - D. -100000
(2)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 const int inf = 0x3f3f3f3f;
05
06 int solve(vector<string> words, string target) {
07 const int n = target.length();
08 set<string> s;
09 for (auto v : words)
10 for (int i = 1; i <= v.length(); i++)
11 s.insert(v.substr(0, i));
12 vector<int> dp(n + 1, inf);
13 dp[0] = 0;
14 for (int i = 0; i < n; i++)
15 for (int j = 0; j <= i; j++)
16 if (s.find(target.substr(j, i - j + 1)) != s.end())
17 dp[i + 1] = min(dp[i + 1], dp[j] + 1);
18 return dp[n] != inf ? dp[n] : -1;
19 }
20
21 int main() {
22 int n;
23 cin >> n;
24 vector<string> a(n);
25 for (int i = 0; i < n; i++)
26 cin >> a[i];
27 string t;
28 cin >> t;
29 cout << solve(a, t) << endl;
30 return 0;
31 }
判断题
{{ select(21) }} 21. 若输入3 abc aaaaa bcdef aabcdabc,则输出为2。( )
{{ select(22) }} 22. 若将第18行中的dp[i+1]改为dp[i],则可能出现编译错误。( )
{{ select(23) }} 23. 该程序的输出一定小于或等于输入的n。( )
选择题
{{ select(24) }} 24. 当输入的a数组为["abababab","ab"], t="ababaababa"时,程序的输出为( )。 - A. 0 - B. 1 - C. 2 - D. 3
{{ select(25) }} 25. 若删除第17行的代码,则当输入的a数组为["abababab","ab"], t="ababa"时程序的输出为( )。 - A. 1 - B. 2 - C. 3 - D. 4
{{ select(26) }} 26. 这段代码的时间复杂度为( )。 - A. O(n) - B. O(nlogn) - C. O(n²) - D. O(nlogn)
(3)
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 int calc(int n, int presses) {
05 set<int> seen;
06 for (int i = 0; i < (1 << 4); i++) {
07 vector<int> pressArr(4);
08 for (int j = 0; j < 4; j++)
09 pressArr[j] = (i >> j) & 1;
10 int sum = 0;
11 for (int j = 0; j < 4; j++)
12 sum += pressArr[j];
13 if (sum % 2 == presses % 2 && sum <= presses) {
14 int status = pressArr[0] ^ pressArr[2] ^ pressArr[3];
15 if (n >= 2)
16 status |= (pressArr[0] ^ pressArr[1]) << 1;
17 if (n >= 3)
18 status |= (pressArr[0] ^ pressArr[2]) << 2;
19 if (n >= 4)
20 status |= (pressArr[0] ^ pressArr[1] ^ pressArr[3]) << 3;
21 seen.insert(status);
22 }
23 }
24 return seen.size();
25 }
26
27 int main() {
28 int n, presses;
29 cin >> n >> presses;
30 cout << calc(n, presses) << endl;
31 return 0;
32 }
判断题
{{ select(27) }} 27. 若输入为2 1,则程序的输出为3。( )
{{ select(28) }} 28. 对于第7行代码,变量i的上界为16。( )
{{ select(29) }} 29. 对于任意的输入,程序的输出不会大于8。( )
选择题
{{ select(30) }} 30. 当输入为n=3,presses=2时,程序的输出为( )。 - A. 5 - B. 6 - C. 7 - D. 8
{{ select(31) }} 31. 若删除第18-19行的代码,当输入为n=3,presses=2时,程序的输出为( )。 - A. 1 - B. 2 - C. 3 - D. 4
{{ select(32) }} 32. 上述代码的时间复杂度为( )。 - A. O(1) - B. O(logn) - C. O(n) - D. O(nlogn)
三、完善程序(单选题,每小题3分,共计30分)
(1)
题目描述:
输入n(1≤n≤2×105)和长为n的数组a(1≤a[i]≤n)。你可以多次执行如下操作:选择两个下标i和j,满足a[i]=a[j]。删除下标[i,j]中的元素。删除后,数组长度减小i-j+1。输出你最多可以删多少个数。
01 #include <bits/stdc++.h>
02 using namespace std;
03
04 const int inf = 0x3f3f3f3f;
05
06 void solve( ) {
07 int n;
08 cin >> n;
09 vector<int> a(n + 1);
10 for (int i = 1; i <= n; i++)
11 cin >> a[i];
12 vector<int> dp(n + 1), ①;
13 for (int i = 1; i <= n; i++) {
14 dp[i] = max(dp[i], ②);
15 dp[i] = max(dp[i], ③);
16 Lst[a[i]] = max(Lst[a[i]], ④);
17 }
18 cout << ⑤ << endl;
19 return;
20 }
21
22 int main() {
23 int t = 1;
24 cin >> t;
25 while (t--)
26 solve();
27 return 0;
28 }
{{ select(33) }} 33. ①处应填( )。 - A. Lst(n+1) - B. Lst(n+1,0) - C. Lst(n+1,inf) - D. Lst(n+1,-inf)
{{ select(34) }} 34. ②处应填( )。 - A. dp[i-1] - B. dp[i]-1 - C. dp[i+1] - D. dp[i]+1
{{ select(35) }} 35. ③处应填( )。 - A. Lst[a[i]] - B. Lst[a[i]]+1+1 - C. Lst[a[i]]+i - D. Lst[i]+1
{{ select(36) }} 36. ④处应填( )。 - A. dp[i-1]-i - B. dp[i-1]+i - C. dp[i+1]-i - D. dp[i+1]+i
{{ select(37) }} 37. ⑤处应填( )。 - A. dp[1] - B. dp[0] - C. dp[n-1] - D. dp[n]
(2)
题目描述: 输入 n (1≤n≤1×105) 和长为 n 的数组 a (0≤a [i]<2)。输出最小的正整数 k,使得 a 的所有长为 k 的连续子数组的 OR 都相同。注意答案是一定存在的,因为 k=n 一定满足要求。
01 #include <bits/stdc++.h>
02 using namespace std;
03 void solve( ) {
04 int n;
05 cin >> n;
06 vector<int> a(n + 1);
07 for (int i = 1; i <= n; i++)
08 cin >> a[i];
09 int ans = 0;
10 for (int i = 0; ①; i++) {
11 int cnt = 0, lst = 0;
12 for (int j = 1; j <= n; j++) {
13 if (②)
14 cnt++;
15 else
16 lst = ③, cnt = 0;
17 }
18 Lst = max(lst, cnt);
19 if (④)
20 continue;
21 ans = max(ans, lst + 1);
22 }
23 cout << ⑤ << endl;
24 }
25
26 int main() {
27 int t = 1;
28 cin >> t;
29 while (t--)
30 solve();
31 return 0;
32 }
{{select (38) }} 38. ①处应填 ( )。
- A. i<20
- B. i<=20
- C. i>20
- D. i!=20 {{select (39) }}
- ②处应填 ( )。
- A. !(a[j]&(1<<i))
- B. a[j]&(1<<j)
- C. a[j]&(1<<i)
- D. !(a[j]&(1<<i))
{{select (40) }}
- ③处应填 ( )。
- A. min(Lst,cnt)
- B. max(Lst,cnt)
- C. cnt
- D. lst+cnt {{select (41) }}
- ④处应填 ( )。
- A. lst<n
- B. Lst!=n
- C. lst==n
- D. Lst>n {{select (42) }}
- ⑤处应填 ( )。
- A. ans
- B. min(ans,n)
- C. min(ans==0?1:ans,n)
- D. (ans==0?1:ans)