前言
模拟赛链接
部分题目没写解析,开学了,在肝作业,咕一下。
正文
单选
1
选C,考察进制转换。
2
选D。∨是或,∧是与,﹁是非。
3
选A。首先排除C、D。然后128MB的栈空间很大,不会发生爆栈。但这个数据量不写记忆化是肯定会TLE的。
4
选B。首先先把树画出来,然后后缀表达式的顺序是左右根。
5
选A。
4
×
60
×
10
×
2048
×
152
×
32
8
×
1024
×
1024
×
1024
\frac{4\times60\times10\times2048\times152\times32}{8\times1024\times1024\times1024}
8×1024×1024×10244×60×10×2048×152×32,算出来约等于21。
6
选C,左右根。
7
选B。相当于是这五个点最多连成的10条线中选1~10根,把算出来的加起来,也就是
C
10
1
+
C
10
2
+
.
.
.
+
C
10
10
C^{1}_{10}+C^{2}_{10}+...+C^{10}_{10}
C101+C102+...+C1010,结果为1024。
8
选D,栈是先进后出,模拟一下即可。
9
选B。第一枚为1的有6+5+4+3+2+1=21种结果,以此类推,一共21+15+10+6+3+1=56种结果。
10
选D。基础知识。
11
选A。插入O(
N
2
N^{2}
N2),希尔O(
N
1.3
N^{1.3}
N1.3),归并和快排O(
N
l
o
g
N
NlogN
NlogN)。
12
选B。选择排序一下。
13
选C。
14
选D。strlen要整成char才可以用。
15
选B。非常幸运,我前几天才看了一个视频叫“CCF走过60年之NOI”,2022-60=1962。好耶!
阅读
一
1 #include <iostream>
2 using namespace std;
3 const int MAXN = 1000050;
4 int n, a[MAXN], a1[MAXN], b[MAXN], lim;
5 void solve1() {
6 for (int i = 1; i <= n; i++)
7 b[a[i]]++; //①
8 for (int i = 1; i <= lim; i++) {
9 if (b[i]) //②
10 cout << i << " ";
11 }
12 cout << endl;
13 }
14 void solve2() {
15 int cnt = 0, flag;
16 for (int i = 1; i <= n; i++) {
17 flag = false;
18 for (int j = 1; j <= n - 1; j++) {
19 if (a[j] > a[j + 1]) {
20 swap(a[j], a[j + 1]);
21 cnt++;
22 flag = true;
23 }
24 }
25 //if (flag==false)
26 // break;
27 }
28 for (int i = 1; i <= n; i++)
29 cout << a[i] << " ";
30 cout << endl;
31 }
32 int main() {
33 cin >> n;
34 for (int i = 1; i <= n; i++) {
35 cin >> a[i];
36 a1[i] = a[i]; //③
37 lim = max(a[i], lim); //④
38 }
39 solve1();
40 for (int i = 1; i <= n; i++)
41 a[i] = a1[i];
42 solve2();
43 return 0;
44 }
1)
F,应该是冒泡排序。
2)
T,没毛病。
3)
F,应该是7。
4)
T,剪了个枝,只要以及排好序就不运行了,加不加都是排好序的结果。
5)
选C,solve1对于相同的数只会输出1次,但solve2会把所以数都输出。C中有相同的数,所以结果不同。
6)
选B,加个循环,有几个输出几个,就一样了。
二
1 #include <cstdio>
2 #include <cstring>
3
4 const int maxn = 1003;
5
6 int type, n, m;
7 char s[maxn], t[maxn];
8
9 int main() {
10 scanf("%d %s %s", &type, t, s);
11 n = strlen(s); m = strlen(t);
12 if (type < 2) {
13 for (int i = 0; i < m; ++i) s[i] = t[i];
14 } else if (type == 2) {
15 strcpy(s, t);
16 // 提示:如果此时调用 printf("%s\n", s),则本次输出结果为整个 t 字符串和换行,没有其他字符。
17 } else {
18 for (int i = 0; i < m; i += 4) {
19 unsigned int code = 0, pos = i;
20 for (int j = 1; pos < i+4; j*=100, ++pos) {
21 if (pos == m) break;
22 code += t[pos] * j;
23 }
24 pos = i;
25 while (code != 0) {
26 s[pos++] = code % 100;
27 code /= 100;
28 }
29 }
30 }
31 for (int i = 0; i < n; ++i) printf("%c", s[i]);
32 printf("\n");
33 }
1)
选F,第12行的<显然不能改。
2)
选T,手动模拟。
3)
选F,同样模拟一下即可。
4)
选T,code上来就对于0说明t[pos]都是0,所以没影响。
5)
选B。if里是O( M 2 M^{2} M2),输出是O( N N N),不知道哪一个大,所以就相加起来。
6)
选C,1是直接替换,3要%100。其中只有C选项的
e
e
eASCII超过了100。
三
答案:
暂时咕咕咕一下,懒(
完善
1
裸的01背包。
1)
选B,m记录背包最大容量。
2)
选C,0元可以。
3)
选D,01背包所以倒着循环,就是个背包模板。
4)
选C,只要自己目前有可能或选了a[i]有可能,就是可以支付。
5)
选B,有的话就++。
2
选A。
选C,观察后面可以看出从0到n-1。
选D。
选B。感谢提醒。
选C,a[j]不是加的话就是减,else里显然是给sum减去a[j]。