1 条题解
-
0
Guest
-
0
CSP-J 2025初赛模拟卷 7
一、单项选择题(共 15 题,每题 2 分,共计 30 分) 第 1 题 十进制数 255 用二进制表示是( )。 第 2 题 C++ 语言的创始人是( )。 第 3 题 以下设备中,( )不是输出设备。 第 4 题 当执行以下 C++ 程序段后输出结果为( )。
char c1 = '2' + 1; char c2 = '2' + 15; cout << c1 << c2 << endl; 第 5 题 应用二分算法的思想,在一个有 n 个数的有序序列中查找某个指定的数,其程序时间复杂度为( )。 第 6 题 贝希要参加 CSP-J 比赛,在 CCF 官网注册时需设置登录密码,下列选项中最安全的是( )。 第 7 题 双向链表的优点是( )。 第 8 题 小明买了一块 1TB 的固态硬盘,相当于( )MB 的存储容量。 第 9 题 下面( )没有用到有关人工智能的技术。 第 10 题 下列选项中( )不是 C++ 标准库 string 类的函数。 第 11 题 有一个 2025 位的正整数,它的各位数字按照如下规则排列:1234567891011...,请问这个数被 9 除的余数是多少?( ) 第 12 题 九宫格数独游戏是一种训练推理能力的数字谜题游戏。九宫格分为九个小宫格,某小九宫格如图所示,小明需要在 9 个小格子中填上 1 至 9 中不重复的整数。小明通过推理已经得到了 4 个小格子中的准确数字,其中,a、b、c、d、e 这 5 个数字未知,且 b 和 d 为奇数,则 a + b > 5 的概率为( )。 第 13 题 四位同学进行篮球传球练习,要求每个人接球后再传给别人。开始时甲同学发球,并作为第一次传球,第五次传球后,球又回到甲同学手中,则不同的传球方法有( )种。 第 14 题 字符串 "cCCsSsPPP" 共有( )种不同的非空子串。 第 15 题 向一个栈顶指针为 head 的链式栈中插入一个指针 p 指向的节点时,应执行( )。 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 V,错误填 ×) (1) #include <bits/stdc++.h> using namespace std;
int t, p, a, b, c; int f(int a, int b) { if (a % b == 0) return 0; return b - a % b; }
void solve() { scanf("%d%d%d%d", &p, &a, &b, &c); printf("%d\n", min(min(f(p, a), f(p, b)), f(p, c))); }
int main() { scanf("%d", &t); while (t--) solve(); return 0; } 判断题 16. 若程序输入
1 2 6 10 9 则最终输出为 4。( ) 17. (2分) 若将第 5 行删除,程序的输出结果一定不会改变。( ) 18. 若将头文件 <bits/stdc++.h> 改成 <stdio.h>,程序仍能正常运行。( )
选择题 19. 若程序输入 2954810999,则输出是( )。 (4分) 若将第 10 行的输出内容改为 f(f(f(p, a), b), c),则输入 1 2 6 10 9 时,输出是( )。 (2) #include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5;
int a, b, n, k; char s[N];
void solve(int a, int b, int k) { while (k--) { putchar(a ? '1' : '0'); a ^= 1; } }
int main() { cin >> a >> b >> k; n = a + b; for (int i = 1; i <= a; ++i) s[i] = '1'; for (int i = 1; i <= b; ++i) s[i + a] = '0'; while ((s[n - k] != '1' || s[n] != '0') && n > k) --n; if (n <= k + 1) return printf("No\n"), 0; printf("Yes\n"); if (!k) return printf("%s\n%s", s + 1, s + 1), 0; a -= 2, b -= 1; int A = a, B = b; printf("11"); solve(A, B, k - 1); putchar(' '); solve(A, B, a + b - k + 1); A = a, B = b; printf("\n11"); solve(A, B, k - 1); putchar(' '); solve(A, B, a + b - k + 1); return 0; } 判断题 21. 去掉第 6 行的两个 &,程序的输出一定不改变。( ) 22. 如果 a == 0,k != 0,则必定输出 No。( ) 23. 当 a + b < k + 3 时,必定输出 No。( ) 24. 若输出 Yes,则输出的两个数在二进制下的差一定有 k 位 1。( )
选择题 25. 若输入为 243,则输出为( )。 若输入为 234,则输出为( )。 (3) #include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5;
int n, m, ans, pos[2][N]; char a[N], b[N];
int main() { scanf("%d%d%s%s", &n, &m, a, b); reverse(a, a + n); reverse(b, b + m); for (int i = 0, now = 0; i < n && now < m; ++i) if (a[i] == b[now]) pos[0][now++] = i; for (int i = n - 1, now = m - 1; ~i && ~now; --i) if (a[i] == b[now]) pos[1][now--] = i; for (int i = 1; i < m; ++i) ans = max(pos[1][i] - pos[0][i - 1], ans); printf("%d", ans); return 0; } 判断题 27. 若 m 不为 n 的子序列,则输出必定为 0。( ) 28. 若将第 8 行删除,程序输出结果一定不会改变。( )
选择题 29. 若输入为 53abaababb,则输出为( )。 若 a = "ababcdc",b 的长度为 5,则使答案取到最大值的 b 可能有( )个。 (4分) 当 a 为 "1010101" 时,b 的长度为 3,b 的每一位上要么是 0,要么是 1。总共有 8 种情况,对应 8 个输出。这 8 个输出的和为( )。 当 a 为 "1010101" 时,b 的长度为 4,b 的每一位上要么是 0,要么是 1。总共有 16 种情况,对应 16 个输出。这 16 个输出的和为( )。 三、完善程序(单选题,每小题 3 分,共计 30 分) (1) 题目描述 给定一个数组 {a[i]} 表示一排蘑菇的数量。有一个篮子。每次到一个新的 a[i] 时,篮子中会增加 a[i] 个蘑菇。如果篮子里的蘑菇超过 x 个,则篮子里的蘑菇会清空。询问有多少组 [1, r],使得从 1 采摘到 r,蘑菇数量不为 0。
#include <bits/stdc++.h> using namespace std; const int N = 2e5 + 5;
int n, X, a[N], cnt[N], dp[N];
int main() { cin >> n >> X; for (int i = 1; i <= n; i++) cin >> a[i]; int l = 1, r = 0, sum = 0; while (l <= n) { while (①) ②; cnt[l] = r; ③; l++; sum = 0; for (int i = n; i >= l; i--) if (cnt[i] == n + 1) dp[i] = ④; sum += dp[i]; } cout << ⑤ << endl; return 0; } ①处应填( )。 ②处应填( )。 ③处应填( )。 ④处应填( )。 ⑤处应填( )。 (2) 题目描述 一个字符串 s (|s| <= 500) 由小写字母组成,有 q (q <= 1e6) 组询问,每组询问给你两个数 l 和 r,问:在字符串区间 [l, r] 的字串中包含多少回文串?
#include <bits/stdc++.h> using namespace std; const int N = 505;
char s[N]; int n, f[N][N], dp[N][N];
bool check(int l, int r) { if (①) return f[l][r]; if (l >= r) return f[l][r] = 1; if (s[l] != s[r]) return f[l][r] = 0; return f[l][r] = ②; }
int main() { memset(f, -1, sizeof(f)); scanf("%s", s + 1); n = strlen(s + 1); for (int i = 1; i <= n; ++i) ③; for (int l = 2; l <= n; ++l) { for (int i = 1; i <= n - l + 1; ++i) { int j = i + l - 1; dp[i][j] = ④; if (check(i, j)) ⑤; } } int T; scanf("%d", &T); while (T--) { int x, y; scanf("%d%d", &x, &y); printf("%d\n", dp[x][y]); } return 0; } ①处应填( )。 ②处应填( )。 ③处应填( )。 ④处应填( )。 ⑤处应填( )。
- 1
信息
- ID
- 9649
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 1
- 上传者