27 · 珅泽教育CSP-J第一轮模拟考第七套

历年真题 · 共 45 题 · 建议用时 60 分钟
开始整卷作答 按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 第 1–15 题 · 共 15 题
## 二、阅读程序(判断题正确填T,错误填F;判断题1分,选择题3分,共计40分) ### 第1题 ```cpp int solve1(int n) { n++; int size = 0; int digit[16]; int pow = 1; int s = 0; while (n > 0) { digit[size] = n % 10; size++; n /= 10; s += pow; pow *= 5; } while (size > 0) { --size; pow /= 5; s += (digit[size] / 2) * pow; if (digit[size] % 2 == 0) break; } return s - 1; } int solve2(int n) { int s = 0; for(int i = 1; i <= n ; i += 2) { int t = i; bool pass = true; while (t > 0) { int x = t % 10; if(x%2 == 0) { pass = false; break; } t /= 10; } if (pass) s++; } return s; } ``` 保证 `solve1` 与 `solve2` 的参数 `n` 是非负整数。 第 16–22 题 · 共 7 题
### 第2题 ```cpp int a[maxn]; int b[maxn]; int n, m; const long long mod = 1'000'000'007; bool filled[maxn][maxn]; long long mem[maxn][maxn]; long long solve(int i, int j) { if (i == n) return 1; if (j == m) return 1; if (filled[i][j]) return mem[i][j]; filled[i][j] = true; long long sum = solve(i+1, j) + solve(i, j+1); if (a[i] == b[j]) { return mem[i][j] = sum % mod; } else { return mem[i][j] = (sum - solve(i+1, j+1)) % mod; } } int main() { std::cin >> n >> m; for (int i = 0; i < n; ++i) std::cin >> a[i]; for (int i = 0; i < m; ++i) std::cin >> b[i]; std::cout << (solve(0, 0) + mod) % mod << "\n"; } ``` 第 23–29 题 · 共 7 题
### 第3题 ```cpp long long k; int n; int p[20]; bool used[20] = {false}; long long frac[20]; void gen(int i) { if (i > n) { for (int i = 1; i <= n; ++i) std::cout << p[i] << " "; return; } for (int a = 1; a <= n; ++a) if (not used[a]) { if (k <= frac[n-i]) { p[i] = a; used[a] = true; gen(i+1); return; } else { k -= frac[n-i]; } } } int main() { n = 1; frac[0] = frac[1] = 1; std::cin >> k; while (k > frac[n]) { k -= frac[n]; frac[n+1] = frac[n] * (n+1); n++; } gen(1); } ``` 第 30–35 题 · 共 6 题
## 三、完善程序(单选题,每小题3分,共计30分) ### 第1题 有一个用户,在连续的 $n$ 天里,都会收到积分,也会消费积分。积分在获得后的 $m$ 天内有效($m$ 为一个给定的整数),过期失效。 在第 $i$ 天,用户将会获得 $p_i$ 分,他需要消费 $c_i$ 分。若积分不足,则用掉全部积分后用其他方式消费。消费积分时,先用最早的。当天获取的积分可以当天消费。请计算这个用户一共消费了多少积分。 ```cpp const int max_size = 100000; int queue[max_size]; int head = 0; int tail = 0; int main() { int n, m; std::cin >> n >> m; int sum = 0; for (int i = 0; i < n; ++i) { int p, c; std::cin >> p >> c; queue[____(1)____] = p; while ( ____(2)____ ) { if ( ____(3)____ ) { queue[head] -= c; sum += c; c = 0; } else { int amount = ____(4)____; c -= amount; sum += amount; } } if ( ____(5)____ > m) { head++; } } std::cout << sum << "\n"; } ``` 第 36–40 题 · 共 5 题
### 第2题 给定一个 $1$ 到 $n$ 的排列 $p_1,p_2,\ldots,p_n$,请统计排列中所有长度大于等于 $2$ 的连续子序列的次大数之和。 定义 $\max_2(a_i,a_{i+1},\ldots,a_j)$ 表示从 $a_i$ 开始到 $a_j$ 结束的连续子序列中,排名第二大的数,这个数就是一个连续子序列的次大数之和。 题目就是要求: $$ \sum_{1 \le i < j \le n} \max_2(a_i,a_{i+1},\ldots,a_j) $$ `solve` 用于解决这个问题。 ```cpp int q[maxn]; int prev[maxn]; int next[maxn]; long long solve(int n, int p[]) { for (int i = 1; i <= n; ++i) { ____(1)____ ; } p[0] = q[0] = prev[0] = 0; p[n+1] = q[n+1] = next[n+1] = n+1; for (int i = 1; i <= n; ++i) { int num = ____(2)____; int prev_num = p[i-1]; int next_num = p[i+1]; prev[num] = ____(3)____; next[num] = ____(4)____; } long long sum = 0; for (int num = 1; num <= n; ++num) { int prev_num = prev[num]; int prev_prev_num = prev[prev_num]; int next_num = next[num]; int next_next_num = next[next_num]; sum += (long long) num * ____(5)____ * (q[next_num] - q[num]); sum += (long long) num * (q[num] - q[prev_num]) * ____(6)____ ; ____(7)____ = prev_num; ____(8)____ = next_num; } return sum; } ``` 第 41–45 题 · 共 5 题
展开逐题清单(单独练某一道)
● 绿=已通过 ● 橙=做过没全对 ● 灰=没做过
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
1. 珅泽教育CSP-J第一轮模拟考第七套 第 1 题 2. 珅泽教育CSP-J第一轮模拟考第七套 第 2 题 3. 珅泽教育CSP-J第一轮模拟考第七套 第 3 题 4. 珅泽教育CSP-J第一轮模拟考第七套 第 4 题 5. 珅泽教育CSP-J第一轮模拟考第七套 第 5 题 6. 珅泽教育CSP-J第一轮模拟考第七套 第 6 题 7. 珅泽教育CSP-J第一轮模拟考第七套 第 7 题 8. 珅泽教育CSP-J第一轮模拟考第七套 第 8 题 9. 珅泽教育CSP-J第一轮模拟考第七套 第 9 题 10. 珅泽教育CSP-J第一轮模拟考第七套 第 10 题 11. 珅泽教育CSP-J第一轮模拟考第七套 第 11 题 12. 珅泽教育CSP-J第一轮模拟考第七套 第 12 题 13. 珅泽教育CSP-J第一轮模拟考第七套 第 13 题 14. 珅泽教育CSP-J第一轮模拟考第七套 第 14 题 15. 珅泽教育CSP-J第一轮模拟考第七套 第 15 题
## 二、阅读程序(判断题正确填T,错误填F;判断题1分,选择题3分,共计40分) ### 第1题 ```cpp int solve1(int n) { n++; int size = 0; int digit[16]; int pow = 1; int s = 0; while (n > 0) { digit[size] = n % 10; size++; n /= 10; s += pow; pow *= 5; } while (size > 0) { --size; pow /= 5; s += (digit[size] / 2) * pow; if (digit[size] % 2 == 0) break; } return s - 1; } int solve2(int n) { int s = 0; for(int i = 1; i <= n ; i += 2) { int t = i; bool pass = true; while (t > 0) { int x = t % 10; if(x%2 == 0) { pass = false; break; } t /= 10; } if (pass) s++; } return s; } ``` 保证 `solve1` 与 `solve2` 的参数 `n` 是非负整数。
16. 珅泽教育CSP-J第一轮模拟考第七套 第 16 题 17. 珅泽教育CSP-J第一轮模拟考第七套 第 17 题 18. 珅泽教育CSP-J第一轮模拟考第七套 第 18 题 19. 珅泽教育CSP-J第一轮模拟考第七套 第 19 题 20. 珅泽教育CSP-J第一轮模拟考第七套 第 20 题 21. 珅泽教育CSP-J第一轮模拟考第七套 第 21 题 22. 珅泽教育CSP-J第一轮模拟考第七套 第 22 题
### 第2题 ```cpp int a[maxn]; int b[maxn]; int n, m; const long long mod = 1'000'000'007; bool filled[maxn][maxn]; long long mem[maxn][maxn]; long long solve(int i, int j) { if (i == n) return 1; if (j == m) return 1; if (filled[i][j]) return mem[i][j]; filled[i][j] = true; long long sum = solve(i+1, j) + solve(i, j+1); if (a[i] == b[j]) { return mem[i][j] = sum % mod; } else { return mem[i][j] = (sum - solve(i+1, j+1)) % mod; } } int main() { std::cin >> n >> m; for (int i = 0; i < n; ++i) std::cin >> a[i]; for (int i = 0; i < m; ++i) std::cin >> b[i]; std::cout << (solve(0, 0) + mod) % mod << "\n"; } ```
23. 珅泽教育CSP-J第一轮模拟考第七套 第 23 题 24. 珅泽教育CSP-J第一轮模拟考第七套 第 24 题 25. 珅泽教育CSP-J第一轮模拟考第七套 第 25 题 26. 珅泽教育CSP-J第一轮模拟考第七套 第 26 题 27. 珅泽教育CSP-J第一轮模拟考第七套 第 27 题 28. 珅泽教育CSP-J第一轮模拟考第七套 第 28 题 29. 珅泽教育CSP-J第一轮模拟考第七套 第 29 题
### 第3题 ```cpp long long k; int n; int p[20]; bool used[20] = {false}; long long frac[20]; void gen(int i) { if (i > n) { for (int i = 1; i <= n; ++i) std::cout << p[i] << " "; return; } for (int a = 1; a <= n; ++a) if (not used[a]) { if (k <= frac[n-i]) { p[i] = a; used[a] = true; gen(i+1); return; } else { k -= frac[n-i]; } } } int main() { n = 1; frac[0] = frac[1] = 1; std::cin >> k; while (k > frac[n]) { k -= frac[n]; frac[n+1] = frac[n] * (n+1); n++; } gen(1); } ```
30. 珅泽教育CSP-J第一轮模拟考第七套 第 30 题 31. 珅泽教育CSP-J第一轮模拟考第七套 第 31 题 32. 珅泽教育CSP-J第一轮模拟考第七套 第 32 题 33. 珅泽教育CSP-J第一轮模拟考第七套 第 33 题 34. 珅泽教育CSP-J第一轮模拟考第七套 第 34 题 35. 珅泽教育CSP-J第一轮模拟考第七套 第 35 题
## 三、完善程序(单选题,每小题3分,共计30分) ### 第1题 有一个用户,在连续的 $n$ 天里,都会收到积分,也会消费积分。积分在获得后的 $m$ 天内有效($m$ 为一个给定的整数),过期失效。 在第 $i$ 天,用户将会获得 $p_i$ 分,他需要消费 $c_i$ 分。若积分不足,则用掉全部积分后用其他方式消费。消费积分时,先用最早的。当天获取的积分可以当天消费。请计算这个用户一共消费了多少积分。 ```cpp const int max_size = 100000; int queue[max_size]; int head = 0; int tail = 0; int main() { int n, m; std::cin >> n >> m; int sum = 0; for (int i = 0; i < n; ++i) { int p, c; std::cin >> p >> c; queue[____(1)____] = p; while ( ____(2)____ ) { if ( ____(3)____ ) { queue[head] -= c; sum += c; c = 0; } else { int amount = ____(4)____; c -= amount; sum += amount; } } if ( ____(5)____ > m) { head++; } } std::cout << sum << "\n"; } ```
36. 珅泽教育CSP-J第一轮模拟考第七套 第 36 题 37. 珅泽教育CSP-J第一轮模拟考第七套 第 37 题 38. 珅泽教育CSP-J第一轮模拟考第七套 第 38 题 39. 珅泽教育CSP-J第一轮模拟考第七套 第 39 题 40. 珅泽教育CSP-J第一轮模拟考第七套 第 40 题
### 第2题 给定一个 $1$ 到 $n$ 的排列 $p_1,p_2,\ldots,p_n$,请统计排列中所有长度大于等于 $2$ 的连续子序列的次大数之和。 定义 $\max_2(a_i,a_{i+1},\ldots,a_j)$ 表示从 $a_i$ 开始到 $a_j$ 结束的连续子序列中,排名第二大的数,这个数就是一个连续子序列的次大数之和。 题目就是要求: $$ \sum_{1 \le i < j \le n} \max_2(a_i,a_{i+1},\ldots,a_j) $$ `solve` 用于解决这个问题。 ```cpp int q[maxn]; int prev[maxn]; int next[maxn]; long long solve(int n, int p[]) { for (int i = 1; i <= n; ++i) { ____(1)____ ; } p[0] = q[0] = prev[0] = 0; p[n+1] = q[n+1] = next[n+1] = n+1; for (int i = 1; i <= n; ++i) { int num = ____(2)____; int prev_num = p[i-1]; int next_num = p[i+1]; prev[num] = ____(3)____; next[num] = ____(4)____; } long long sum = 0; for (int num = 1; num <= n; ++num) { int prev_num = prev[num]; int prev_prev_num = prev[prev_num]; int next_num = next[num]; int next_next_num = next[next_num]; sum += (long long) num * ____(5)____ * (q[next_num] - q[num]); sum += (long long) num * (q[num] - q[prev_num]) * ____(6)____ ; ____(7)____ = prev_num; ____(8)____ = next_num; } return sum; } ```
41. 珅泽教育CSP-J第一轮模拟考第七套 第 41 题 42. 珅泽教育CSP-J第一轮模拟考第七套 第 42 题 43. 珅泽教育CSP-J第一轮模拟考第七套 第 43 题 44. 珅泽教育CSP-J第一轮模拟考第七套 第 44 题 45. 珅泽教育CSP-J第一轮模拟考第七套 第 45 题