zoukankan      html  css  js  c++  java
  • NOIp初赛题目整理

    NOIp初赛题目整理

    这个 blog 用来整理扶苏准备第一轮 csp 时所做的与 csp 没 有 关 系 的历年 noip-J/S 初赛题目,记录了一些我从不知道的细碎知识点,还有一些憨憨题目,不定期更新。

    1、(07senior,5) 在C 语言中,表达式 (23~mid~2~land^~5) 的值是( )

    ​ A. (23) B.(1) C.(18) D.(32) E.(24)

    Answer:A

    Solution:这题一看就是要考运算符优先级来着。在 (C) 语言中,按位与大于按位异或大于按位或,这里的大于指优先级大于,优先级越大越优先计算,因此计算过程为 (2~land~5~=~7)。然后计算 (23~mid~7 = 23)

    需要指出的是,左右移的优先级大于上述三个运算,因此 (C) 语言表达式 1 | p << 1 是先算 p << 1,再对 (1) 取或,例如 (1~mid~1~<<~3) 的答案是 (9)

    2、(07senior,12) 与十进制数 (17.5625) 对应的 (8) 进制数是( )。

    ​ A.(21.5625) B.(21.44) C.(21.73) (D.21.731)

    Answer:B

    Solution:这里介绍一下分数的进制转换。先考虑 (10) 进制转换成 (k) 进制。

    首先整数部分按照整数的进制转化进行,即不断除以进制数再取余数。

    然后将原数不断的去掉整数部分后乘 (k),第 (i) 次乘 (k) 后整数部分的值即为答案第 (10^{-i}) 位的值,一直做直到达到精度位数要求。

    例如:(17.5625),整数部分被转换为 (21),去掉整数部分为 (0.5625),乘 (8) 得到 (4.5),因此十分位为 (4)(4.5) 去掉整数部分为 (0.5),乘 (8) 得到 (4.0),因此百分位为 (4)(4.0) 去掉整数部分后为 (0),因此后面的位数都是 (0)

    对于 (k) 进制转 (10) 进制的情况,则整数部分依旧按照整数转换法则转换,对于小数部分,将 (k^i) 分位的数乘上 (frac{1}{k^i}),相加即可得到 (10) 进制小数部分的值。

    3、(07senior,14,不定项选择) 已知 (7) 个结点的二叉树的先根遍历是 1 2 4 5 6 3 7(数字为结点的编号,以下同),后根遍历是 4 6 5 2 7 3 1,则该二叉树的可能的中根遍历是( )

    A. 4 2 6 5 1 7 3 B. 4 2 5 6 1 3 7 C. 4 2 3 1 5 4 7 D. 4 2 5 6 1 7 3

    Answer:A B D

    Solution:二叉树遍历序什么的早都忘干净了……

    众所周知,二叉树一共有三种深度优先遍历序,分别是先序遍历,中序遍历和后序遍历。这里先中后指的是记录根的时间,而左右子树的顺序总是先左子树再右子树。例如先序遍历,则先记录当前子树的根节点,然后递归对左子树做先序遍历,再递归对右子树做先序遍历;而中序遍历则先对左子树递归做中序遍历,然后记录根节点,最后对右子树递归做中序遍历。

    对于一棵树,只要确定中序遍历序和另外任意一个深度优先遍历序,即可唯一确定这棵树的形态,但是只知道先序遍历和后序遍历则不能唯一确定这棵树的形态。需要指出的是,确定先序遍历和后序遍历以后,即可确定节点间的父子关系,但是无法区分左右节点

    对于本题,首先可以铁憨憨枚举四个选项,这样即可得到中序遍历和先序遍历,再验证后序遍历即可。

    考虑更一般化的做法,通过已知的两个遍历序确定节点间的父子关系即可。

    例如,根据先序遍历,(2) 一定是 (1) 的孩子,根据后序遍历,(3) 一定是 (1) 的孩子,因此 (2,~3) 一定是 (1) 的两个孩子,又因为 (2) 在先序遍历中比 (3) 先出现,所以 (2) 是左孩子,(3) 是右孩子。

    又根据先序遍历的性质,右孩子左侧的一定都是左子树或根,因此 (2,~4,~5,~6) 都在根的左子树内。根据先序遍历,(4) 要么是 (2) 的孩子,要么是 (2) 的兄弟。但由于 (3)(2) 的兄弟,所以 (4)(2) 的孩子。

    根据后序遍历,可以确定 (5)(2) 的另一个孩子,又由于 (4)(5) 之前出现,因此 (4) 是左孩子,(5) 是右孩子。

    根据先序遍历,(6)(5) 的孩子,但是由于 (5) 只有一个孩子,无法确认左右。至此,左子树的父子关系已经全部确定,类似的可以确定右子树的父子关系,然后即可确定可能的中序遍历。

    今年 CSP 只考选择题来着,我还是选择铁憨憨枚举选项吧

    4、(07senior,18,不定项选择) 在下列关于算法复杂性的说法中,正确的有( )。

    A. 算法的时间复杂度,是指它在某台计算机上具体实现时的运行时间

    B. 算法的时间复杂度,是指对于该算法的一种或几种主要的运算,运算的次数与问题的规模之间的函数关系

    C. 一个问题如果是NPC类的,就意味着在解决该问题时,不存在一个具有多项式时间复杂度的算法.但这一点还没有得到理论上的证实,也没有被否定

    D. 一个问题如果是NP类的,与C有相同的结论

    Answer:BC

    Solution:首先 A,B 的对错显然,这边记录一下有关P问题,NP问题,NPC问题,NP-Hard问题的有关定义。

    对于一个问题,如果它可以使用多项式时间复杂度的算法进行求解,则它是一个 P问题(polynomial problem),这里 polynomail 指的是 “多项式的”。例如,给定 (n) 个数对他们按照不降序进行排序,可以使用 (O(n log n)) 的算法解决,因此这个问题是一个P问题。

    对于一个问题,如果它可以用多项式时间复杂度的算法来验证一个解的正确性,则他是一个 NP问题(Non-deterministic Polynomial Problem),这里 Non-deterministic 指 “不确定的”,NP问题的中文直译为 “非确定性多项式问题”。这里不要求对原问题进行求解,只要给出原问题的一个解以后就可以用多项式的算法来验证这个解是否正确的问题,都被称为 NP 问题。例如,“对于一张 (n) 个点 (m) 条边的有向图,求它的一条回路满足经过每个节点恰好一次”这个问题(哈密尔顿回路)想要求解目前只有指数级的枚举每条边的选择情况,但是一旦我给出这个问题的一个解,我便可以使用 (O(m)) 的算法来轻松验证这个解是否正确,因此这个问题是一个 NP 问题。同样的,对于上面一段的排序问题,如果你给出了它的一个解,我显然可以 (O(n)) 去验证这个解是否正确,因此“给 (n) 个数进行排序” 也是一个 NP 问题。

    一个可以证明的事实是,一个 P 问题一定是一个 NP 问题,也即一个可以用多项式时间复杂度求解的问题一定是可以用多项式时间复杂度检验一个解的正确性。因此,P 问题集合是 NP 问题集合的子集。而 P 问题集合是否等于 NP 问题集合,就是著名的 P-NP 问题,又成为 P =? NP 问题。目前的普遍观点是不等于,但是无法给出证明。

    归约:对于一个问题 (A),如果他能经过多项式时间复杂度的转化而转化成问题 (B),也即得出问题 (B) 的解以后可以用多项式的时间复杂度转化为问题 (A) 的解,则称 (A) 可以 归约(B)。例如将一元一次方程加上一个系数为 (0) 的二次项以后可以通过求解一元二次方程的方法求解,因此说求解一元一次方程可以归约为求解一元二次方程。一个显然的事实是归约具有传递性,即若 (A) 可以归约为 (B)(B) 可以归约为 (C),则 (A) 可以归约为 (C)。显然,只要可以使用多项式复杂度解决 (C),即可使用多项式复杂度解决 (A)

    存在一个 NP 问题 (A),使得所有 (NP) 问题都可以归约为 (A) 问题,而 (A) 问题有很多个并且他们是完全等价的,所有的 (A) 问题被称为 NPC问题(Non-deterministic Polynomial Complete Problem)。显然只要给任意一个 NPC 问题找到一个多项式算法,即可用多项式时间复杂度解决所有 NP 问题,从而证明 P = NP,但是目前并不能在多项式时间复杂度内解决任何一个 NPC 问题。根据第一句话,我们给出 NPC 问题的定义:

    1、该问题是一个 NP 问题

    2、任何一个 NP 问题都可以通过有限次的归约最终归约为该问题

    只要满足上述两个条件的问题,都被称为 NPC 问题。第一个 NPC 问题是逻辑电路问题:给定一个有多个输入端的和多个逻辑门以及一个输出端的逻辑电路,求逻辑门的一个输入满足这个逻辑门的输出端为 true。

    对于上面 NPC 问题的定义,如果一个问题满足第二条,但不一定满足第一条,则其是一个 NP-Hard问题(Non-deterministic Polynomial Hard Problem)。根据定义,NP-Hard 问题可以被任何一个 NP 问题使用多项式的时间复杂度归约到,但是自身不一定是一个 NP 问题。

    因此我得出结论:NOIp的大部分题目都是 P (雾)

    (07senior,21) 给定 (n) 个有标号的球,标号依次为1,2,…,n。将这 (n) 个球放入 (r) 个相同的盒子里,不允许
    有空盒,其不同放置方法的总数记为 (S(n,r)),求 (S(7,~4))

    Answer:350

    Solution:没打算做填空来着,但是看到第二类斯特灵数就记一下吧……反正我也忘了。

    题面即为第二类斯特灵数的定义。当求 (S(i, j)) 时,假设前 (i-1) 个球都已经放到了盒子里,现在考虑第 (i) 个球:

    如果前 (i-1) 个球放到了 (j) 个盒子里,那么这个球随便找个盒子放即可,方案数为 (j imes S_{i - 1,j})

    如果前 (i - 1) 个球放到了 (j - 1) 个盒子里,那么这个球只能自己新放一个盒子,方案数为 (S_{i - 1, j -1})

    根据加法原理,(S_{i,j} = S_{i - 1, j - 1} + j imes S_{i - 1, j})

    (07junior,7) LAN的含义是( )

    ​ A.因特网 B.局域网 C.广域网 D.城域网

    Answer:B

    Solution:休学不考 IT 会考的报应来了

    局域网:LAN(Local Area Network);广域网:WAN(Wide Area Network);城域网:MAN(Metropolitan Area Network)

    下次还是对着英文蒙吧

  • 相关阅读:
    《全职高手》的全部职业和职业技能(最新版)
    博客园样式美化
    科幻电影免费百度云分享(Scince-fiction cloud share)
    阅读须知
    Website's Game source code
    #P2010 回文日期 的题解
    #P1909 买铅笔 的题解
    #P4770 [NOI2018]你的名字 的题解
    #1074 骑士问题 的题解
    [C++基本语法:从菜鸟变成大佬系列,就像1,2,3那么简单](七):C++的修饰符
  • 原文地址:https://www.cnblogs.com/yifusuyi/p/11645448.html
Copyright © 2011-2022 走看看