难题
NOIP2010 问题求解 T2
无向图G有7个顶点,若不存在由奇数条边构成的简单回路,则它至多有______条边。
答案:12。
如果要满足上诉条件,那么G是一个二分图。
因为要求边数最多,因此二分图的左右两半点数要尽可能平均,于是答案就是 3 × 4 = 12 3\times 4=12 3×4=12。
NOIP2010 问题求解 T3
记T为一队列,初始时为空,现有n个总和不超过32的正整数依次入队。如果无论这些数具体为何值,都能找到一种出队的方式,使得存在某个时刻队列T中的数之和恰好为9,那么n的最小值是_______。
答案:18
满足条件的队列其实就是其中连续的一段数的和为9的队列。
令前缀和数组 S i = ∑ j = 1 i S j ( S 0 = 0 ) S_i=\sum_{j=1}^iS_j\space(S_0=0) Si=∑j=1iSj (S0=0),那么条件就变为了 ∃ i , j ∈ [ 1 , n ] , i < j , S j − S i = 9 \exist i,j\in [1,n],i<j,S_j-S_i=9 ∃i,j∈[1,n],i<j,Sj−Si=9。
然后通过列举差为9的数列发现,最多可以选出18个数使得任意两个数的差不为9(其中0和32一定要选),如果选19个,就一定存在相差为9的数对,所以答案是18,因为18个数的序列形成的前缀和有19个。
某机构模拟卷 单选题
已知参数k,对于递归式 T ( n ) = k n T ( n ) + n T(n)=k\sqrt{n}T(\sqrt{n})+n T(n)=knT(n)+n的说法,正确的是________
A.当 k = 1 k=1 k=1时, T ( n ) = O ( n log n ) T(n)=O(n\log n) T(n)=O(nlogn)
B.当 k = 1 k=1 k=1时, T ( n ) = O ( n log 2 n ) T(n)=O(n\log^2 n) T(n)=O(nlog2n)
C.当 k = 4 k=4 k=4时, T ( n ) = O ( n log n ) T(n)=O(n\log n) T(n)=O(nlogn)
D.当 k = 4 k=4 k=4时, T ( n ) = O ( n log 2 n ) T(n)=O(n\log^2 n) T(n)=O(nlog2n)
答案:D(我选了A)
- 当k=1时,发现 T ( n ) = n T ( n ) + n = n + ( n ) 2 + ⋯ \begin{aligned} T(n)&=\sqrt{n}T(\sqrt{n})+n\\&=n+(\sqrt{n})^2+\cdots \end{aligned} T(n)=nT(n)+n=n+(n)2+⋯
其实就是一堆n加在一起,其中参数每下一层都被开了平方。这就相当于把n用二进制数表示出来,每一次都把位数除以2,这样的次数是 log 2 log 2 n \log_2\log_2n log2log2n的,所以 T ( n ) = O ( n log 2 log 2 n ) T(n)=O(n\log_2\log_2n) T(n)=O(nlog2log2n)。 - 当k=4时,发现 T ( n ) = ( 1 + 4 + 16 + ⋯ ) n = 4 log 2 log 2 n n \begin{aligned}T(n)&=(1+4+16+\cdots)n\\&=4^{\log_2\log_2n}n\end{aligned} T(n)=(1+4+16+⋯)n=4log2log2nn由于 2 log 2 log 2 n = log n 2^{\log_2\log_2n}=\log n 2log2log2n=logn, 4 log 2 log 2 n n = n log 2 n 4^{\log_2\log_2n}n=n\log^2n 4log2log2nn=nlog2n,故选D
NOIP2012 多选题 T7
答案:AB(我选了ABCD)
A和B,根据多年代码经验,是对的。
C的话,反例是a=T,b=T,c=F;D的反例是a=T,b=F,c=F。
这种情况不是很多的题最好列表格,每种情况都列出来计算。
NOIP2012 多选题 T5
一棵二叉树一共有19个节点,其叶子节点可能有( )个。
A.1 B.9 C.10 D.11
答案:ABC(我选了AC)
二叉树的叶子节点至少有一个(如下图所示)
可以考虑把6号节点接到4号节点下面,这样就有2个叶子节点了。
再把4号节点接到2号节点下面,就有3个叶子节点了。
以此类推,若这个二叉树有n个节点,最后可以得出一棵有 ⌊ n + 1 2 ⌋ \left \lfloor \frac{n+1}{2} \right \rfloor ⌊2n+1⌋个叶子节点的二叉树。
因此二叉树的叶子节点数可能为 [ 1 , ⌊ n + 1 2 ⌋ ] \left[1,\left \lfloor \frac{n+1}{2} \right \rfloor\right] [1,⌊2n+1⌋]中的任意整数。
NOIP2012 问题求解 T1
答案:256
发现直接构造布尔表达式很麻烦,不如从取值方面考虑。
如果有两个布尔表达式不等价,那么它们在p,q,r取某些值时值不同(用三元组(p,q,r)表示这些取值)。因此不妨把(0,0,0),(0,0,1),(0,1,0)……所对应的取值列举出来,只要有某一位不同即是不同的布尔表达式。一共有 2 3 = 8 2^3=8 23=8位,共有 2 8 = 256 2^8=256 28=256种取值。
NOIP2012 问题求解 T2
答案:5536(我算出来的是6436)
可以用DP求解。设 f i , 0 / 1 f_{i,0/1} fi,0/1表示在以 i 为根的子树中,节点 i 选或不选时的不同独立集数量。
那么可以得到状态转移方程
f i , 0 = ∏ j ∈ s o n i f j , 0 + f j , 1 f i , 1 = ∏ j ∈ s o n i f j , 0 \begin{aligned} f_{i,0}&=\prod_{j\in son_i}f_{j,0}+f_{j,1}\\ f_{i,1}&=\prod_{j\in son_i}f_{j,0} \end{aligned} fi,0fi,1=j∈soni∏fj,0+fj,1=j∈soni∏fj,0
边界条件是 f i , 0 = f i , 1 = 1 ( i是叶子节点 ) f_{i,0}=f_{i,1}=1\quad(\text{i是叶子节点}) fi,0=fi,1=1(i是叶子节点)。
这样子暴力计算就好了。最后可以得出根节点的左右两个儿子的 f i , 0 f_{i,0} fi,0值都为44, f i , 1 f_{i,1} fi,1值为16(左右两个子树是对称的)
然后我就算错了……
NOIP2017 单选题 T8
由四个不同的点构成的简单无向连通图的个数是( )。
A.32 B.35 C.38 D.41
答案:C(我选了B)
不妨考虑点数分别为1,2,3,4时的答案( a n s i ans_i ansi表示点的编号为 1 ~ i 的点组成的无向连通图的个数):
- 显然 a n s 1 = 1 ans_1=1 ans1=1。
- 显然 a n s 2 = 1 ans_2=1 ans2=1。
- 如果1、2之间没有连边,那么3就必须和它们都连边;如果1、2之间有连边,那么3就可以选择向这个块连3-1的边或3-2的边,也可以两条都连上,但是不能不连。因此 a n s 3 = a n s 1 + a n s 2 × ( 2 2 − 1 ) = 4 ans_3=ans_1+ans_2\times(2^2-1)=4 ans3=ans1+ans2×(22−1)=4。
- 分类讨论,得到 a n s 4 = 1 + 9 + 28 = 38 ans_4=1+9+28=38 ans4=1+9+28=38:
- 如果1、2、3之间没有连边,那么4就必须和它们都连边,只有1种方案;
- 如果4和一个大小为1的块和一个大小为2的块连边,那么4就必须和大小为1的块连边,且要和大小为2的块连1~2条边,共有 ( 2 3 ) × ( 2 2 − 1 ) = 9 \left(_{2}^{3}\right)\times\left(2^2-1\right)=9 (23)×(22−1)=9种方案( ( 2 3 ) \left(_{2}^{3}\right) (23)表示给那3个点标号的方案);
- 如果4和1个大小为3的块连边,那么有 a n s 3 × ( 2 3 − 1 ) = 28 ans_3\times\left(2^3-1\right)=28 ans3×(23−1)=28种方案。
概念题
某机构模拟卷 单选题
下列算法中,没有用到贪心思路的算法为________
A.计算无向图最小生成树的Kruskal算法。
B.计算无向图点双连通分量的Tarjan算法。
C.计算无向图单源最短路的Dijkstar算法。
D.以上算法均使用了贪心的思路。
答案:B(我选了D)
我对贪心算法的理解错了……
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
Tarjan算法并没有进行选择,它只有一种解,故选B。
某机构模拟卷 单选题
若要使用g++编译器,开启-Ofast
优化,且使用C++11标准,将源文件prog.cpp
编译为可执行程序exec
,且保留调试信息,则需要使用的编译命令为________
A.g++ prog.cpp -Ofast exec -std=c++11 -debug
B.g++ prog.cpp -Ofast exec -std=c++11 -g
C.g++ prog.cpp -o exec -Ofast -std=c++11 -debug
D.g++ prog.cpp -o exec -Ofast -std=c++11 -g
答案:D(我选了A)
注意到题目要求调试,因为调试的英文为debug,而我记得确实有debug的命令,于是就在A和C中随机选了一个(光荣掉坑)。
据说-debug
的语句是不合法的,由于编译信息的基本格式是gcc 源文件名 -o 程序名
,因此选D。
NOIP2010 单选题 T2
一个字节(byte)由( )个二进制位组成。
A.8 B.16 C.32 D.以上都有可能
答案:A
8位=1B 1024B=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB