70 · CSP 2020 第一轮(初赛)模拟

CSP 2020 · 共 43 题 · 建议用时 60 分钟
开始整卷作答 按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共 $15$ 题,每题 $2$ 分,共 $30$ 分) 第 1–15 题 · 共 15 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 第 16–16 题 · 共 1 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 1. ```cpp #include<iostream> using namespace std; #define MAXN 20 int gu[MAXN][MAXN]; int luo(int n, int m) { if(n <= 1 || m < 2) return 1; if(gu[n][m] != -1) return gu[n][m]; int ans = 0; for(int i = 0; i < m; i += 2) ans += luo(n - 1, i); gu[n][m] = ans; return ans; } int main() { int n, m; cin >> n >> m; for(int i = 0; i < MAXN; i++) for(int j = 0; j < MAXN; j++) gu[i][j] = -1; cout << luo(n, m); return 0; } ``` 第 17–21 题 · 共 5 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 第 22–22 题 · 共 1 题
2. ```cpp #include<bits/stdc++.h> using namespace std; int n, m; int f[101][101]; int F[101][101]; int main() { scanf("%d%d", &n, &m); // n的值在1到100之间 memset(f, -1, sizeof(f)); for(int i = 1; i <= m; i++) { int u, v, w; // w的值在0到10000之间 scanf("%d%d%d", &u, &v, &w); f[u][v] = f[v][u] = w; } for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(f[i][k] != -1 && f[k][j] != -1) if(f[i][j] == -1||f[i][j]>f[k][j]+f[i][k]) f[i][j] = f[i][k] + f[k][j]; int ans = 2147483647; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { for(int x = 1; x <= n; x++) for(int y = 1; y <= n; y++) F[x][y] = f[x][y]; F[i][j] = F[j][i] = 0; for(int x = 1; x <= n; x++) for(int y = 1; y <= n; y++) if(F[x][y]==-1||F[x][y]>F[x][i]+F[i][y]) F[x][y] = F[x][i] + F[i][y]; for(int x = 1; x <= n; x++) for(int y = 1; y <= n; y++) if(F[x][y]==-1||F[x][y]>F[x][j]+F[j][y]) F[x][y] = F[x][j] + F[j][y]; int res = 0; for(int x = 1; x <= n; x++) for(int y = 1; y < x; y++) res += F[x][y]; ans = min(res, ans); } printf("%d\n", ans); return 0; } ``` 第 23–27 题 · 共 5 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 第 28–28 题 · 共 1 题
3. ```cpp #include<bits/stdc++.h> using namespace std; #define MOD 19260817 #define MAXN 1005 long long A[MAXN][MAXN] = {0}, sum[MAXN][MAXN] = {0}; int n, m, q; int main() { A[1][1] = A[1][0] = 1; for(int i = 2; i <= 1000; i++) { A[i][0] = 1; for(int j = 1; j <= i; j++) A[i][j] = (A[i - 1][j] + A[i - 1][j - 1]) % MOD; } for(int i = 1; i <= 1000; i++) for(int j = 1; j <= 1000; j++) sum[i][j] = (sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + A[i][j] + MOD) % MOD; int q; cin >> q; while(q--) { int n, m; cin >> n >> m; cout << sum[n][m] << endl; } return 0; } ``` 第 29–33 题 · 共 5 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 第 34–34 题 · 共 1 题
1. (封禁 xxs)现有 $n$ 个 xxs(编号为 $1$ 到 $n$),每个 xxs 都有一个关注者,第 $i$ 个 xxs 的关注者是 $a_i$。现在管理员要将其中的一些 xxs 的账号封禁,但需要注意的是如果封禁了第 $i$ 个人,那么为了不打草惊蛇,就不能封禁他的关注者 $a_i$。现在想知道最多可以封禁多少个 xxs。 输入第一行是一个不超过 $300000$ 的整数 $n$,第二行是 $n$ 个 $1$ 到 $n$ 的整数表示 $a_i$。 输出一行,一个整数表示答案。 ```cpp #include <cstdio> using namespace std; #define MAXN 300005 int n, ans = 0, a[MAXN], in[MAXN] = {0}; bool vis[MAXN] = {0}; void dfs(int cur, int w) { if(vis[cur]) return; vis[cur] = true; if(w == 1) ans++; ① if(②) dfs(a[cur], ③); } int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); in[a[i]]++; } for(int i = 1; i <= n; i++) if(!in[i]) ④; for(int i = 1; i <= n; i++) if(⑤) dfs(i, 0); printf("%d\n", ans); return 0; } ``` 第 35–38 题 · 共 4 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 第 39–43 题 · 共 5 题
展开逐题清单(单独练某一道)
● 绿=已通过 ● 橙=做过没全对 ● 灰=没做过
## 一、单项选择题(共 $15$ 题,每题 $2$ 分,共 $30$ 分)
1. CSP 2020 第一轮(初赛)模拟 第 1 题 2. CSP 2020 第一轮(初赛)模拟 第 2 题 3. CSP 2020 第一轮(初赛)模拟 第 3 题 4. CSP 2020 第一轮(初赛)模拟 第 4 题 5. CSP 2020 第一轮(初赛)模拟 第 5 题 6. CSP 2020 第一轮(初赛)模拟 第 6 题 7. CSP 2020 第一轮(初赛)模拟 第 7 题 8. CSP 2020 第一轮(初赛)模拟 第 8 题 9. CSP 2020 第一轮(初赛)模拟 第 9 题 10. CSP 2020 第一轮(初赛)模拟 第 10 题 11. CSP 2020 第一轮(初赛)模拟 第 11 题 12. CSP 2020 第一轮(初赛)模拟 第 12 题 13. CSP 2020 第一轮(初赛)模拟 第 13 题 14. CSP 2020 第一轮(初赛)模拟 第 14 题 15. CSP 2020 第一轮(初赛)模拟 第 15 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分)
16. CSP 2020 第一轮(初赛)模拟 第 16 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分) 1. ```cpp #include<iostream> using namespace std; #define MAXN 20 int gu[MAXN][MAXN]; int luo(int n, int m) { if(n <= 1 || m < 2) return 1; if(gu[n][m] != -1) return gu[n][m]; int ans = 0; for(int i = 0; i < m; i += 2) ans += luo(n - 1, i); gu[n][m] = ans; return ans; } int main() { int n, m; cin >> n >> m; for(int i = 0; i < MAXN; i++) for(int j = 0; j < MAXN; j++) gu[i][j] = -1; cout << luo(n, m); return 0; } ```
17. CSP 2020 第一轮(初赛)模拟 第 17 题 18. CSP 2020 第一轮(初赛)模拟 第 18 题 19. CSP 2020 第一轮(初赛)模拟 第 19 题 20. CSP 2020 第一轮(初赛)模拟 第 20 题 21. CSP 2020 第一轮(初赛)模拟 第 21 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分)
22. CSP 2020 第一轮(初赛)模拟 第 22 题
2. ```cpp #include<bits/stdc++.h> using namespace std; int n, m; int f[101][101]; int F[101][101]; int main() { scanf("%d%d", &n, &m); // n的值在1到100之间 memset(f, -1, sizeof(f)); for(int i = 1; i <= m; i++) { int u, v, w; // w的值在0到10000之间 scanf("%d%d%d", &u, &v, &w); f[u][v] = f[v][u] = w; } for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) if(f[i][k] != -1 && f[k][j] != -1) if(f[i][j] == -1||f[i][j]>f[k][j]+f[i][k]) f[i][j] = f[i][k] + f[k][j]; int ans = 2147483647; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { for(int x = 1; x <= n; x++) for(int y = 1; y <= n; y++) F[x][y] = f[x][y]; F[i][j] = F[j][i] = 0; for(int x = 1; x <= n; x++) for(int y = 1; y <= n; y++) if(F[x][y]==-1||F[x][y]>F[x][i]+F[i][y]) F[x][y] = F[x][i] + F[i][y]; for(int x = 1; x <= n; x++) for(int y = 1; y <= n; y++) if(F[x][y]==-1||F[x][y]>F[x][j]+F[j][y]) F[x][y] = F[x][j] + F[j][y]; int res = 0; for(int x = 1; x <= n; x++) for(int y = 1; y < x; y++) res += F[x][y]; ans = min(res, ans); } printf("%d\n", ans); return 0; } ```
23. CSP 2020 第一轮(初赛)模拟 第 23 题 24. CSP 2020 第一轮(初赛)模拟 第 24 题 25. CSP 2020 第一轮(初赛)模拟 第 25 题 26. CSP 2020 第一轮(初赛)模拟 第 26 题 27. CSP 2020 第一轮(初赛)模拟 第 27 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分)
28. CSP 2020 第一轮(初赛)模拟 第 28 题
3. ```cpp #include<bits/stdc++.h> using namespace std; #define MOD 19260817 #define MAXN 1005 long long A[MAXN][MAXN] = {0}, sum[MAXN][MAXN] = {0}; int n, m, q; int main() { A[1][1] = A[1][0] = 1; for(int i = 2; i <= 1000; i++) { A[i][0] = 1; for(int j = 1; j <= i; j++) A[i][j] = (A[i - 1][j] + A[i - 1][j - 1]) % MOD; } for(int i = 1; i <= 1000; i++) for(int j = 1; j <= 1000; j++) sum[i][j] = (sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + A[i][j] + MOD) % MOD; int q; cin >> q; while(q--) { int n, m; cin >> n >> m; cout << sum[n][m] << endl; } return 0; } ```
29. CSP 2020 第一轮(初赛)模拟 第 29 题 30. CSP 2020 第一轮(初赛)模拟 第 30 题 31. CSP 2020 第一轮(初赛)模拟 第 31 题 32. CSP 2020 第一轮(初赛)模拟 第 32 题 33. CSP 2020 第一轮(初赛)模拟 第 33 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分)
34. CSP 2020 第一轮(初赛)模拟 第 34 题
1. (封禁 xxs)现有 $n$ 个 xxs(编号为 $1$ 到 $n$),每个 xxs 都有一个关注者,第 $i$ 个 xxs 的关注者是 $a_i$。现在管理员要将其中的一些 xxs 的账号封禁,但需要注意的是如果封禁了第 $i$ 个人,那么为了不打草惊蛇,就不能封禁他的关注者 $a_i$。现在想知道最多可以封禁多少个 xxs。 输入第一行是一个不超过 $300000$ 的整数 $n$,第二行是 $n$ 个 $1$ 到 $n$ 的整数表示 $a_i$。 输出一行,一个整数表示答案。 ```cpp #include <cstdio> using namespace std; #define MAXN 300005 int n, ans = 0, a[MAXN], in[MAXN] = {0}; bool vis[MAXN] = {0}; void dfs(int cur, int w) { if(vis[cur]) return; vis[cur] = true; if(w == 1) ans++; ① if(②) dfs(a[cur], ③); } int main() { scanf("%d", &n); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); in[a[i]]++; } for(int i = 1; i <= n; i++) if(!in[i]) ④; for(int i = 1; i <= n; i++) if(⑤) dfs(i, 0); printf("%d\n", ans); return 0; } ```
35. CSP 2020 第一轮(初赛)模拟 第 35 题 36. CSP 2020 第一轮(初赛)模拟 第 36 题 37. CSP 2020 第一轮(初赛)模拟 第 37 题 38. CSP 2020 第一轮(初赛)模拟 第 38 题
## 二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 $2$ 分,选择题 $3$ 分,共计 $40$ 分)
39. CSP 2020 第一轮(初赛)模拟 第 39 题 40. CSP 2020 第一轮(初赛)模拟 第 40 题 41. CSP 2020 第一轮(初赛)模拟 第 41 题 42. CSP 2020 第一轮(初赛)模拟 第 42 题 43. CSP 2020 第一轮(初赛)模拟 第 43 题