noip2003讲稿

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

E=errorLeabharlann Why?FriSat
Sun
E
E
E
E
E
E
(2,1)
(3,0) (3,0) (3,0) (3,0) (3,0) (3,0) E (1,2) (1,2) (1,2) (1,2) (1,2) (1,2) E
大家注意到为什么会出现错误呢? 题目中的一句话很重要:
他的同学中有N个人始终说假话,其余的人始终说真。
证词中出现的其他话,都不列入逻辑推理的内容。 明明所知道的是, 他的同学中有N个人始终说 假话,其余的人始终说真。现在,明明需要你 帮助他从他同学的话中推断出谁是真正的凶手, 请记住,凶手只有一个! 【输入格式】 输入由若干行组成,第一行有二个整数,M (1≤M≤20)、N(1≤N≤M和P(1≤P≤100); M是参加游戏的明明的同学数,N是其中始终说谎 的人数,P是证言的总数。接下来M行, 每行是明明的一个同学的名字(英文字母组成, 没有主格,全部大写)。
树是一种具有子结构的存储结构,用f(i,j)表示 从第i个节点到第j个节点的最大加分二叉树, 则dp方程为: F(i,j)=max{f(i,i)+f(i+1,j),f(i+1,i+1)+f(I,i)*f(I +2,j),f(I+2,I+2)+f(I,I+1)*f(I+3,j),……,f(j1,j-1)+f(I,j-2)*f(j,j),f(j,j)+f(I,j-1)};
所以,我们可以看出,本题可以通过模拟推算过程 来实现。
1、读入 本题的难点在于理解题目。对读入的处理也是至关重要的。 要对输入格式有正确。 2、推算
对每个节点进行推算,直至推算到最后一个节点。
3、输出 找出输出层的节点,输出即可。
W:array[1..2,1..max]of integer{存储边的起始点、终止点}
【输入样例】 5 5 7 1 2 10
【输出样例】 145 3 1 2 4 5
ABC
B C E D
A F G I H
前根遍历:A B C D E F G H I
中根遍历:C B E D A G F I H 后根遍历:C E D B G I H F A
我们对样例进行分析: 中根遍历:1(5) 2(7) 3(1) 4(2) 5(10) {节点编号(本点原分数)} 7=7 前根遍历:3 1 2 4 5
如果得知一个人既说真话又说假话,这种情况 是不存在的。所以要判错。<细节1> 又一个问题出现了,如果有人不说话怎么办? 他是“亦正亦邪的”,即有可能说真话,也有 可能说假话,在考虑问题时要注意。<细节2> 读入时要注意对空格的消除,冒号后存在空格! <细节3>
法一的时间复杂度约为: O(C(n,m){20! /(10!*10!)=184756} 法二的时间复杂度约为: O(n^2){30^2=900} 而法一的编程复杂度是很高的,所以我们应当选 取高效的算法。
Back
本体难点在于字符串的处理,有可能注意 不到对空格的消除,第二个难点在于逻 辑判断,要对题目进行全面的理解,比 如,所有的人必须只说假话或只说真话, 还有,如果不说话应当怎么办?这些都是 应当仔细考虑的问题。
[题三]
【问题描述】 设 一 个 n 个 节 点 的 二 叉 树 tree 的 中 序 遍 历 为 (l,2,3,…,n),其中数字1,2,3,…,n为节点编号。 每个节点都有一个分数(均为正整数),记第j个节 点的分数为di,tree及它的每个子树都有一个加分, 任一棵子树subtree(也包含tree本身)的加分计算 方法如下: subtree的左子树的加分× subtree的右子树的加 分+subtree的根的分数 若某个子树为空,规定其加分为1,叶子的加分就 是叶节点本身的分数。不考虑它的空 子树。
但我们需注意到,法一的编程复杂度是很较高的, 不易控制,再加上字符串的处理,将会占用很 长的编程时间,那么是不是有更好的解决方法 呢? 于是,我注意到了这句话:
凶手只有一个!
我们看到事实只有一个,我们可以通过枚举事实, 进而判断说假话和说真话的人数。可以得到问题的 解。
如样例:
罪犯\(对, 错)\日期 MIKE CHARLES KATE Mon Tue Wed Thr
10=10
145 3
12 1 7 2 12 4 10 5
12=5+7
12=2+10 145=12*12+1
根据中根遍历与前根遍历我们可以确定唯一的树。
根据前面对样历的分析,我们可以注意到 在中根遍历中,一个节点的左子树与右 子树分别分布于节点的两侧。 大家有何想法? 想到此性质后,我开始想到: 能否通过中根遍历生成所有可能的树,在对 其进行计算,取其最大值? 此方法属于穷举法,效率是较低的。 下面,来让我们来看动态规划法。
法一: 我注意到有一个人是在说假话的,那么我假设某 一个人说的是假话,很容易得知道了凶手是 Mike. 那么,我们是不是可以通过找到说假话的人的集 合(m个人),判断他们是否都说假话,是否矛盾, 余下的人是否说真话? 是否矛盾?然后得到问题的解? 如我们在样例中找到的说假话的人的集合(说假话 总人数): {MIKE}(3),{CHARLES}(2),{KATE}(1). 即可得到解。
兰兰规定, C i 服从公式:(其中 n 是网络中所有神 经元的数目) C W C U
i
公式中的 W ji (可能为负值)表示连接 j 号神经元和 i 号神经元 的边的权值。当 C i 大于 0 时,该神经元处于兴奋状态,否则就 处于平静状态。当神经元处于兴奋状态时,下一秒它会向其他神 经元传送信号,信号的强度为 C i 。如此.在输入层神经元被激 发之后,整个网络系统就在信息传输的推动下进行运作。现在, 给定一个神经网络,及当前输入层神经元的状态( C i ),要求 你的程序运算出最后网络输出层的状态。
【输入样例】 56 10 10 01 01 01 131 141 151 231 241 251
【输出样例】 31 41 51
[题意分析]
本题是难度不高的题目,关键在于理解题目描述,经过读题,我们 可以知道,题中的神经网络,是分阶段的一张有向图,要求我们经 过推算,输出最后输出层的状态值,而非输入层的神经元的状态值 是通过与他相连的上一层神经元的状态所决定的。
试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树 tree。要求输出; (1)tree的最高加分 (2)tree的前序遍历 【输入格式】 第1行:一个整数n(n<30),为节点个数。 第2行:n个用空格隔开的整数,为每个节点的分数(分数 <100)。 【输出格式】 第1行:一个整数,为最高加分(结果不会超过 4,000,000,000)。 第2行:n个用空格隔开的整数,为该树的前序遍历。
By Gaoxiang on 2007.10.19
NIOP2003共四道题: 1.神经网络(Network)
[模拟题,本题难点在于领会题意,难度不大,考 察基本数据结构与编程技能]
2.侦探推理(Logic) [考察对字符串的处理,难点在于题目的逻辑运算] 3.加分二叉数(Binary)
[考察树的遍历及某些算法的应用]
【输出样例】 MIKE
[分析]
经过读题可知,本题大意是有n位同学,分 为两部分,一部分只说真话,另一部分 只说假话,他们说了q句话而其中有一名 同学是罪犯,要求我们找出这名罪犯。 显然,这是一个逻辑推理的游戏。
而根据题目,我们知道有用的信息分为两类:罪 犯是谁?今天是星期几?那么我们怎样确定谁说 的是假话呢?进而找到罪犯?
【问题描述】
在兰兰的模型中,神经网络就是一张有向图,图中的节点称为神经 元,而且两个神经元之间至多有一条边相连,下图是一个神经元的 例子:
神经元〔编号为 1 ) 图中, X1—X3 是信息输入渠道, Y1 - Y2 是信息输出渠道, C i 表示神经元目前的状态, U i 是阈值,可视为神经元的一个内在参 数。神经元按一定的顺序排列,构成整个神经网络。在兰兰的模型 之中,神经网络中的神经元分为几层;称为输入层、输出层,和若 干个中间层。每层神经元只向下一层的神经元输出信息,只从上一 层神经元接受信息。下图是一个简单的三层神经网络的例子。
可以想到,真相存在于矛盾之中,而事实, 是不可被改变的。
我是罪 犯! 今天是星 期一。 我是罪 犯!!
今天是星 期二。
显然他们两个是矛盾 大家有什么想法吗? 的。
让我们来看看样例:
315 MIKE CHARLES KATE MIKE:I am guilty. MIKE:Today is Sunday. CHARLES:MIKE is guilty. KATE:I am guilty. KATE:How are you??
( j,i )E

ji
j
i
【输入格式】 输入文件第一行是两个整数 n ( 1≤n≤20 )和 p 。接下来 n 行,每 行两个整数,第 i + 1 行是神经元 i 最初状态和其阈值( U i ),非 输入层的神经元开始时状态必然为 0 。再下面 P 行,每行由两个整 数 i , j 及一个整数 W ij ,表示连接神经元 i 、 j 的边权值为 W ij 。 【输出格式】 输出文件包含若干行,每行有两个整数,分别对应一个神经元的编 号,及其最后的状态,两个整数间以空格分隔。 仅输出最后状态非 零的输出层神经元状态,并且按照编号由小到大顺序输出!若输出 层的神经元最后状态均为 0 ,则输出 NULL 。
V:array[1..max]of integer{存储各边的权值} A:array[1..maxn]of record ci,ui:integer; end;{存储各结点信息}
For I取所有的节点 if a[i] 不为输出层 then for j取每条边 if (边j的终点是I)and(边j的起点结点ci>0) then 计算
输入样例561010010101131141151231241251输出样例314151题意分析本题是难度不高的题目关键在于理解题目描述经过读题我们可以知道题中的神经网络是分阶段的一张有向图要求我们经过推算输出最后输出层的状态值而非输入层的神经元的状态值是通过与他相连的上一层神经元的状态所决定的
NOIP2003试题讲稿
它实际上是在枚举第I个节点到第j个节点中的根 结点,取其中的最大值作为最优子策略。
I\j 1
1 5
2 12
3
4
5
f(1,2)=max{5+7,5+7}; f(2,3)=max{7+1,7+1};
2
3
7
8
1 3
f(3,4)=max{1+2,1+2};
f(4,5)=max{2+10,2+10 };
4
5
Back
总结:
1、本题虽为较易的题目,但也需要认真的读题,理解题意, 否则不容易做对。
2、本题在叙述方面有欠妥当的地方,如边的权值、神经元的 状态值Ci、Ui均未给出取值范围。
[题二.侦探推理]
【问题描述】
明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于 是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同 学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下), 明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学, 被询问者可能会说:
【输出格式】 如果你的程序能确定谁是罪犯,则输 出他的名字;如果程序判断出不止一个 人可能是 罪犯,则输出 Cannot Determine;如果程 序判断出没有人可能成为罪犯,则输出 Impossible。
【输入样例】 3 1 5 MIKE CHARLES KATE MIKE:I am guilty. MIKE:Today is Sunday. CHARLES:MIKE is guilty. KATE:I am guilty. KATE:How are you??
2
12
10
I\j 1
1 5
2 12
3 13
4
5
f(1,3)=max{5+8,7+5*1,12 +1};
2
3
7
8
1
15
3
f(2,4)=max{7+4,1+2*7,8+ 2} f(3,5)=max{1+12,2+1*10, 13 3+10}
4.传染病控制(Epidemic) [考察递归算法的运用]
[题一]神经网络 【问题背景】
人工神经网络( Artificial Neural Network )是一种新兴的具有自我 学习能力的计算系统,在模式识别、函数逼近及贷款风险评估等诸 多领域有广泛的应用。对神经网络的研究一直是当今的热门方向, 兰兰同学在自学了一本神经网络的入门书籍后,提出了一个简化模 型,他希望你能帮助他用程序检验这个神经网络模型的实用性。
相关文档
最新文档