NOIP 2003解题报告

第一题(神经网络):

题目大意,给出一些点,每个点都有2个值,c和u,给出一些有向边,权值为w。入度为0的点的c已知,其它点的c未知,每个入度不为0的点node的c等于sum(c[k]*w[k][node]),k为与它相连(有向边指向node)的点。求所有出度为0且c>0的点。

解题过程:

此题的方法应该很多,比如拓扑排序,BFS等;我直接写了个递归,要求某个点的c,就先访问所有与它相连的点,递归下去直到 碰到入度为0的点。。 较麻烦的送分题,30分钟AC

第二题(侦探推理):

明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:

证词中出现的其他话,都不列入逻辑推理的内容。 明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真。

现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个! 如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是 罪犯,则输出 Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出 Impossible。

解题过程:

这题真心恶心,代码写的老长,字符串的处理超恶心,刚写完时连样例都过不去,结果发现好多小错误,比如保存变量时,题目是总共m人,n人说谎,我比较习惯用n表示总人数,结果枚举罪犯的时候循环里就写成n了。

基本算法:枚举罪犯和今天是星期几,然后依次判断每个人的话,去掉废话,记录说谎的人的总数,根据说谎的人的总数来判断这种假设是否可能成立。

要点1:题目说 “有N个人始终说假话”,“始终”两个字非常关键,因此还要记录每个人之前是否说了真话或谎话或者未确定。。如果某个人又说真话又说假话,那么这种情况也是要排除的。

要点2: 如果说谎话的人数小于n,这种情况也是可行的(一开始写成如果liars!=n就return)。

要点3:还要记录说真话的人数,如果大于m-n也是不行的。。

要点4:如果有多个假设成立,不能马上下结论嫌疑犯不止一个人,因为有可能是2个假设的罪犯是同一个,但是星期几不同。 折腾了一个下午,yzoi死都过不去,其他OJ就AC了。

第三题(加分二叉树):

设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:     subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数     若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空 子树。     试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。要求输出;     (1)tree的最高加分     (2)tree的前序遍历  解题过程: 白书上原题,经典dp模型。。枚举区间里的根, 然后就分成了2个区间,就变成了2个子问题,取最优情况即可。

第四题 (传染病控制):

近来,一种新的传染病肆虐全球。蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延。不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带者,更没有研制出疫苗以保护易感人群。于是,蓬莱国的疾病控制中心决定采取切断传播途径的方法控制疾病传播。经过 WHO(世界卫生组织)以及全球各国科研部门的努力,这种新兴传染病的传播途径和控制方法已经研究消楚,剩下的任务就是由你协助蓬莱国疾控中心制定一个有效的控制办法。
    研究表明,这种传染病的传播具有两种很特殊的性质;     第一是它的传播途径是树型的,一个人X只可能被某个特定的人Y感染,只要Y不得病,或者是XY之间的传播途径被切断,则X就不会得病。     第二是,这种疾病的传播有周期性,在一个疾病传播周期之内,传染病将只会感染一代患者,而不会再传播给下一代。     这些性质大大减轻了蓬莱国疾病防控的压力,并且他们已经得到了国内部分易感人群的潜在传播途径图(一棵树)。但是,麻烦还没有结束。由于蓬莱国疾控中心人手不够,同时也缺乏强大的技术,以致他们在一个疾病传播周期内,只能设法切断一条传播途径,而没有被控制的传播途径就会引起更多的易感人群被感染(也就是与当前已经被感染的人有传播途径相连,且连接途径没有被切断的人群)。当不可能有健康人被感染时,疾病就中止传播。所以,蓬莱国疾控中心要制定出一个切断传播途径的顺序,以使尽量少的人被感染。

你的程序要针对给定的树,找出合适的切断顺序。

解题过程:

1.一开始感觉是树形dp,然后就朝着树形dp的方向去想,对于某个节点,切断某个儿子,处理剩下的儿子不就是子问题了么 。然后就几下写了个O(n)的算法,自己测了几个数据都对到了,于是信心满满地提交,结果只过了5个点。 仔细想想发现这些子问题是不能同时进行的。因此这种算法只适用于二叉树(自己出的数据都是二叉树。。),竟然能过5个点。。

2.实在想不出dp方法,百度了一下竟然说是搜索题。然后就自己写了个搜索。。由于传染病每次往下传一层,而每一层都只能断掉一个,所以可以以层为状态DFS。一开始预处理出每一层有哪些点,然后DFS,枚举断掉的点,用一个数组flag表示某个点是否已经断掉,记录被传染的人数或者枚举断点的时候要先看看它到根的路径中有没有点已经断了,如果断了,这个点就不能算进被传染的人数,或者再去把这个点断了。 一开始不敢写搜索是因为n<=300.。 程序写起来挺简单,40分钟写好,修改2次后AC;

收获:

1.树形的题目不一定就是树形dp,做题不要死钻一种算法,要从多角度去想,大胆去做。

2.字符串的处理要灵活,char数组和string哪个方便用哪个;

3.充分琢磨题意,比如第2题侦探题的“始终”2个字,还有第一题最后只要求输出 输出层(出度为0的点),一开始都搞错了。

NOIP 2003解题报告

时间: 2024-10-16 17:02:26

NOIP 2003解题报告的相关文章

NOIP 2006 解题报告

第一题: 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记一定等于后一颗珠子的头标记.因为只有这样,通过吸盘(吸盘是Mars人吸收能量的一种器官)的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可以被吸盘吸收的能量.如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为(Mars单位),新产生的珠子的头标记为m,尾

NOIP 2000解题报告

题目简单,思路很快就有,关键是代码实现能力,大概3个多小时完成.第一题:题目大意:将一个10进制数N转换成-B进制数 (负进制转换):B<=20, N(-32768<=N<=32767): 解题过程:首先想到仿照 正进制转换过程,但结果中有负数,就想到把负数处理掉,加个B即可,为了是结果不变,比它高1位的那一位要加1,这样某一位又有可能出现B这个数字,同理减去一个B,高位减去1:重复知道全部是0到B-1的数字:40分钟一次AC 第二题:题目大意:给定一个N位数字,用k个乘号将其划分为k+

NOIP 2001解题报告

第一题:  有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d  均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差的绝对值>=1.要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位. 解题过程: 直接枚举,把根的范围扩大到100来处理 (精确到小数点后2位 ),水题,15分钟写完AC.如果精确到小数点后6位什么的,就只能二分求解了..我是把结果和0相差不到0.02的 就当成

10 noip 机器翻译 解题报告

题目描述 Description 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义 来替换.对于每个英文单词,软件会先在内存中查找这个单词的中文含义,如果内存中有, 软件就会用它进行翻译:如果内存中没有,软件就会在外存中的词典内查找,查出单词的中 文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译. 假设内存中有M个单元,每单元能存放一个单词和译义.每当软件将一个新单词存入 内存前,如

NOIp 2010 解题报告

1.   机器翻译 可以看出这是一道队列的模拟题目.按照题目要求模拟翻译过程即可. 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int q[1010],n,m,vis[1010]; 10 11

NOIp 2013 Day2 解题报告

NOIp 2013 Day2 解题报告 1.   积木大赛 每次只要选取连续最大的一段区间即可. 继续归纳可得,答案为∑i=1nmax{0,hi-hi-1} 复杂度O(N) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable/

NOIp 2013 Day1 解题报告

NOIp 2013 Day1 解题报告 1.   转圈游戏 不难看出答案就是(x+m*10k) mod n 用快速幂算法,复杂度O(log2k) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 8 //variable// 9 int n,m,x,

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的