CSP-s初赛复习

难题

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,SjSi=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)=kn T(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)=n T(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=jsonifj,0+fj,1=jsonifj,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×(221)=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)×(221)=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×(231)=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

猜你喜欢

转载自blog.csdn.net/huangzihaoal/article/details/108944586