noip2003提高组题解

这一年的前三题虽然难度不高,但是第二题极为繁琐,想在考场上用较短的时间拿到第二题的分数难上加难。所以必须要调整策略,争取拿其他三题的分数。第四题是比较普通的搜索题,分数比较好拿,但是很容易想成树形DP,就只能拿30~50分。

?

第一题:神经网络

模拟

有几个注意点:

  1. 输入层(即第一层)的结点的U(阈值)是没有用的;
  2. 题目说输出「最后状态非零的输出层神经元状态」,但实际上输出的是状态大于0的值。

由于没有注意到神经元只有在兴奋状态时才会向下传送信号,所以WA了1次。

?

第二题:侦探推理

模拟+枚举

我用的是比较笨拙的枚举策略:枚举哪些人说的是真话,哪些人说的是假话。

但更好的策略是:枚举谁是凶手。

繁琐但不难,注意几个点:

  1. 凶手只有一个。那么当只有一个人且根据其话语无法推出是不是凶手时,其必然是凶手;
  2. 程序无法确定出凶手时可能是Cannot Determine,也可能是Impossible,需要根据具体情境进行特殊处理。

花了很久才AC,与我的解题策略的选择有莫大的关系。

?

第三题:加分二叉树

动态规划

很可惜做这道题在最开始的时候就想错了,用贪心写了一下,结果只过了1个点。应该说很多题目都是看似可以用贪心做但其实应该用动规(01背包、石子合并等),这也是以后做题时的一个注意点。

首先题目要求构造的树的中序遍历要有序,其实也就是由序列(1,2,…,n)构造出一棵二叉排序树:选择某个数字为根,把比它小的数字安排在它的左子树,把比它大的数安排在它的右子树,递归进行。

问题就是如何选择根?

由题意可以看出,一个数字的层次越深,它对整个二叉树的加分的「贡献」就越大,所以我想到的是贪心策略:将权值大的结点尽量安排在树的叶端,即把权值最小的结点作为根。

这样的贪心策略看似正确而且也符合样例数据,但其实是错误的。根据上面所述,如果按照贪心策略构建出这样的树,那么最理想的状态是结点的权值与深度应该成正比(但是为了满足BST的性质需要进行调整)。如果每次将权值最小的结点作为根,往往达不到这样的状态。比如:结点1,2,…,n对应的权值为99,2,2,…,2,则权值最大的结点1会被安排在权值最小的结点2的左子树而且成为叶子结点,这样分配明显是很不合理的。

正确的策略应该是采用动态规划,枚举需要用哪个结点作为根。

f(l, r) 表示将区间 [l, r] 构建成加分二叉树所得的最大加分(区间 [l, r] 表示结点编号),则

f(l, r) = max{ f(l, j) * f(j+1, r) + w(j), l<=j<=r}

边界条件:f(l, r) = 1 (l > r)

时间复杂度:O(n^3)

?

第四题:传染病控制

搜索

一开始以为是动规,但实际上有后效性。

按层进行搜索,枚举哪一条边需要被截断,将已被阻断的子树上的结点做标记,然后搜索下一层。

有一个普通的剪枝:如果当前感染人数大于已找到的最小人数则回溯。

但是很奇怪的是只有一个点过不了,而且答案只和标准答案相差1,实在无力调试,所以就针对特殊情况打表骗了个AC。

?

经验教训:

  1. 要总结平时遇到的容易想错算法的题目(动规想成贪心、搜索想成动规),寻找其特点与规律;
  2. 多做题目就会对各种算法适用的题型有更清晰的认识和更深刻的理解,帮助解题;
  3. 不能轻视模拟题,有些模拟题题目较复杂,要有提炼题目的能力。

noip2003提高组题解,布布扣,bubuko.com

时间: 2024-10-25 07:34:26

noip2003提高组题解的相关文章

vijos 1106 &amp; NOIP2003 提高组 侦探推理 题解

[原题] P1106侦探推理 Accepted 标签:[显示标签] 描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯.接着,明明逐个询问每一个同学,被询问者可能会说: 证词中出现的其他话,都不列入逻辑推理的内容. 明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真. 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,

noip2004提高组题解

这次有两道题以前已经做过了,所以分数什么的也没有意义了.发现这年的难度设置极不靠谱,前三题都比较简单,最后一题太难,不知道出题人怎么想的. 第一题:储蓄计划 模拟. 第二题:合并果子 贪心.每次选最小的两堆合并. 第三题:合唱队形 两次动规.题目可以转化为找出一个人,使得以他为尾的最长上升子序列的长度最大,并且以他为首的最长下降子序列的长度也最大. 第四题:虫食算 马上想到搜索.但是规模太大,N可能有26位,如果简单枚举那么运算次数是26!≍4e27:剪枝方面只想到一个很弱的剪枝(对于26的规模

noip2000提高组题解

事实再次向我证明了RP的重要性... 第一题:进制转换 是我最没有把握AC的一道题目却是我唯一一道AC的题目,真是讽刺.看完题目几乎完全没有往正常的解法(取余倒序)去想,直接写了搜索,因为数据范围在2^16,感觉枚举每一位上的数应该就够了,但是在自己的电脑上连样例都用了3.4s,然后想不到任何有效的剪枝,就果断放弃了.最后写完其他三题之后还是回过头看了下这道题,还是没往正常的解法想....结果惊人地AC了...RP真的太重要了. 然后经提醒终于想到了正常一点的解法,查了网上的题解之后开始自己写取

NOIP 2014 提高组 题解

NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法,直接模拟,别读错题. 1 int wn[5][5]={{2,0,1,1,0}, 2 {1,2,0,1,0}, 3 {0,1,2,0,1}, 4 {0,0,1,2,1}, 5 {1,1,0,0,2}}; 6 7 int n,na,nb; 8 int a[222],b[222]; 9 int s1,s

noip2010提高组题解

NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n的棋盘,每个格子对应一个分数,1,2,3,4的卡片共m张,给出四种卡片各自的数量,求改变出牌顺序能获得的最大分数. 思路:开了一个四维的f[i][j][k][l]来表示每张牌有了几张时的最大分数: F[i][j][k][l]=max(f[i-1][j][k][l],f[i][j-1][k][l],f

NOIP2007 提高组 题解

2007 提高组题解 第一题 一开始还想是不是要用哈希表储存呢,但仔细想了一会儿,那个数据量20W 用个快排序,时间是能过的.所以这道题用个STL的快排,再一个循环统计个数就OK了.但最后交上去评测时0分,很尴尬.就是我在数据初始化时从一开始计数,我循环又从一开始,你懂的,多算了一次,爆掉了.改了就100了.200W的话数据就很强了,用哈希好一些. 第二题 额,写得很快,果然这种无脑模拟题最适合我了.但自信没检查,带了3组给的数据就走了.果然错了,过了4个点好像.主要是题没读完,没有判断处于字母

noip2009提高组题解

第一题:潜伏者 模拟 注意点: 不同的密文对应的明文不同,反过来,不同的明文对应的密文也不同,我用了两个hash表来实现: 26个明文字母必须有对应的密文字母,我用了两个计数变量来判断是否26个字母都有匹配. ? 第二题:Hankson的趣味题 数论 对 a0, a1, b0, b1 四个数进行质因数分解,然后确定 x 的各质因数的指数的取值范围,运用乘法原理解决.详细分析见下: (引用自http://wenwen.sogou.com/z/q169562042.htm) Gcd(x,a0)=a1

noip2001提高组题解

今天继续感动滚粗.第一次提交170分,不能多说. 第一题:一元三次方程 明明是寒假讲分治的时候做过的题居然还是WA而且只拿了60分,说明知识掌握实在不够牢固. 寒假做的是保留4位小数,原题只保留2位,又因为答案在[-100,100],所以直接枚举-10000到10000即可. 然后鉴于寒假的时候写的二分,我就傻X兮兮地在循环里面写了个二分...尼玛经验害死人啊...更可怕的是题目的hint里也明显地提示了二分...然后我就逗比了. 提交4次AC . 第二题:数的划分 去年学回溯的时候就做过,所以

noip2008提高组题解

第一题:笨小猴 模拟 ? 第二题:火柴棒等式 搜索 深搜不用说,确定出两个加数然后判断能否拼出等式. 枚举确实不太好搞,因为枚举范围不确定,太大了容易超时,太小了容易漏解.不过这题的数据貌似很温和,我从 0~1000 枚举也能过. ? 第三题:传纸条 多线程动态规划 跟 2000 年的方格取数很像. 还是看做两个人同时从左上角走到右下角.用 f(i, j, k) 表示横纵坐标和为 i,第一个人的行坐标为 j,第二个人的行坐标为 k 时的最大和. 由于一个地方不能走两次,所以对于除了终点以外的所有