Noip 提高组初赛错题集
Noip2017
单项选择题
(3) \(1600\times900\times16\div8\div1024=2812.5\text{KB}\)。选 C。
(4) \(1949\sim2017\) 中有 \((2016-1952)\div4+1=17\) 个闰年,每年至少会有 \(365\bmod7=1\) 天的偏移,闰年在此基础上会增加 \(1\) 天的偏移,所以总偏移量为 \((2017-1949+17)\bmod7=1\)。所以为星期六。选 C。
(8) 这个简单无向连通图可以有 \(3\sim(4\times(4-1)\div2=6)\) 条边,其中有三条边的情况中,有 \(4\) 种情况不连通(有 \(1\) 个孤立点)。所以答案为 \(C_6^6+C_6^5+C_6^4+C_6^3-4=38\)。选 C。
(9) 根据隔板法,共有 \(C_{7+4-1}^{4-1}=C_{10}^3=120\) 种方案。选 D。
不定项选择题
(3) 基数排序、冒泡排序、插入排序、归并排序是稳定的。选 D。
(5) 王选奖是 CCF 的计算机奖项。选 BD。
问题求解
(2)第二问 考场上不大可能做出来。
阅读程序写结果
(2) 本质上是个填数独的程序。遇到这种程序可以先输入一个较小的 \(n\) 来模拟,然后看看规律。一般牵扯到二维数组的都有很明显的规律。
(4)第三问 考场上不大可能做出来。
Noip2018
阅读程序写结果
(4)第二问 因为要求的全排列排名很大,所以枚举会累死,需要用康托展开或者优化暴力算法。具体优化方法:当排列的后 \(k\) 位单调递增时,可以直接跳 \(k!\) 位,跳到第 \((k+1)\) 位为前 \(k\) 位中比原来第 \((k+1)\) 位大的最小数,后面 \(k\) 位单调递增排列。以下是模拟过程(最后一列数是排名):
1 5 3 4 6 2 1
1 5 3 6 2 4 2
1 5 3 6 4 2 3
1 5 4 2 3 6 4
1 5 6 2 3 4 10
1 6 2 3 4 5 16
2 1 3 4 5 6 40
3 1 2 4 5 6 160
3 2 1 4 5 6 184
3 2 4 1 5 6 190
3 2 5 1 4 6 196
3 2 5 4 1 6 198
3 2 5 6 1 4 200
用康托展开做:
原来的排列有 \(0*5!+3*4!+1*3!+1*2!+0*1!+0*1=80\) 个排列小于它。
因此答案为:3 2 5 6 1 4
。
CSP-S 2019
单项选择题
(6) 对枚举进行优化。\((1,2,4,8)\) 有 \(24\) 个;有一个重复数字的有 \(6\) 种,每种 \(12\) 个;有两个重复数字的有 \(1\) 种,\(6\) 个。共 \(24+6*12+6=102\) 个。选 B。
(9) 选项都很小,可以直接枚举。
阅读程序
2.4 这个并查集没有判断 x 和 y 是否在同一集合内,所以可能超过 \(n\)。
完善程序
2
令 \(f(i)\) 表示石子数为 \(i\) 时先手有无必胜策略。显然 \(f(i)=\operatorname{OR}\{f(i-b[j])\}\)。因为 \(b\) 中元素 \(\le64\),所以只需要 \(f(i)\) 的最后 \(64\) 位,本质上是个卡空间。
另外,石子数为 \(0\) 的时候先手必败,所以 status 一开始设成表示 \(0\) 的那一位是 \(0\),前面全 \(1\)。
弄懂了这个就好答了。
附 C++ 位运算符优先级:
~
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|