NOIP2008提高组复赛题解---best.ppt_第1页
NOIP2008提高组复赛题解---best.ppt_第2页
NOIP2008提高组复赛题解---best.ppt_第3页
NOIP2008提高组复赛题解---best.ppt_第4页
NOIP2008提高组复赛题解---best.ppt_第5页
免费预览已结束,剩余32页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NOIP2008提高组复赛题解 河南省实验中学彭勃 题目描述 笨小猴的词汇量很小 所以每次做英语选择题的时候都很头疼 但是他找到了一种方法 经试验证明 用这种方法去选择选项的时候选对的几率非常大 这种方法的具体描述如下 假设maxn是单词中出现次数最多的字母的出现次数 minn是单词中出现次数最少的字母的出现次数 如果maxn minn是一个质数 那么笨小猴就认为这是个LuckyWord 这样的单词很可能就是正确的答案 第一题笨小猴 输入格式 输入文件word in只有一行 是一个单词 其中只可能出现小写字母 并且长度小于100 输出格式 输出文件word out共两行 第一行是一个字符串 假设输入的的单词是LuckyWord 那么输出 LuckyWord 否则输出 NoAnswer 第二行是一个整数 如果输入单词是LuckyWord 输出maxn minn的值 否则输出0 样例1输入 error输出 LuckyWord2解释 单词error中出现最多的字母r出现了3次 出现次数最少的字母出现了1次 3 1 2 2是质数 样例2输入 olymipic输出 NoAnswer0解释 单词olympic中出现最多的字母i出现了2次 出现次数最少的字母出现了1次 2 1 1 1不是质数 思路 统计单词中每个字母的出现次数 挑出最多的次数和最少的次数 不包括0次 相减判断是否为质数即可 判断质数时可以写函数判断 也可以把100以内的质数列成常量数组直接判断 因为单词最多只有100个字母 需要注意的是输出时的LWNA四个字母要大写 总结 这是一道送分题 没有什么难度 需要注意的细节也不多 所以在比赛中是一定要拿满分的 参考样程 include include include defineI F word in defineO F word out usingnamespacestd strings shortans voidInput voidSearch boolPd voidOutput intmain Input Search Output return0 voidInput ifstreamfin I F fin s fin close voidSearch 统计字母出现次数 shorti max 0 min 200 shortf 26 0 for i 0 i0 if f i max max f i if f i min min f i ans max min voidOutput ofstreamfout O F if Pd fout LuckyWord n ans endl elsefout NoAnswer n0 n fout close boolPd 判断质数 if ans 1 returnfalse elseif ans 2 returntrue elseif ans 2 0 returnfalse elsefor shorti 3 i sqrt double ans i 2 if ans i 0 returnfalse returntrue 问题描述 给你n根火柴棍 你可以拼出多少个形如 A B C 的等式 等式中的A B C是用火柴棍拼出的整数 若该数非零 则最高位不能是0 用火柴棍拼数字0 9的拼法如图所示 图略 注意 1 加号与等号各自需要两根火柴棍2 如果A B 则A B C与B A C视为不同的等式 A B C 0 3 n根火柴棍必须全部用上 第二题火柴棒等式 输入格式 输入文件matches in共一行 有一个整数n n 24 输出格式 输出文件matches out共一行 表示能拼成的不同等式的数目 样例1输入 14输出 2解释 2个等式为0 1 1和1 0 1 样例2输入 18输出 9解释 9个等式为 0 4 4 0 11 11 1 10 11 2 2 4 2 7 9 4 0 4 7 2 9 10 1 11 11 0 11 思路 枚举两加数 计算所需火柴棒是否等于n 枚举范围0 1000 总结 这也是比较水的一道题 数据规模较小 算法简单 比赛中这样的题也应该拿到满分 参考样程 include defineI F matches in defineO F matches out defineMAX1000usingnamespacestd constshortmatch 10 6 2 5 5 4 5 6 3 7 6 10个数字所需火柴棒longans shortn voidInput intMatches intx voidSearch voidOutput intmain Input Search Output voidInput ifstreamfin I F fin n fin close intMatches intx 计算摆出x所需的火柴棒 intt x s 0 if x 0 return6 elsewhile t 0 s match t 10 t 10 returns voidSearch inti j n 4 for i 0 i MAX i for j 0 j i j 这样对于A B和B A就只会搜索到一次 可以节约一半时间if Matches i Matches j Matches i j n if i j ans 2 elseans Output函数略 问题描述 小渊和小轩是好朋友也是同班同学 他们在一起总有谈不完的话题 一次素质拓展活动中 班上同学安排做成一个m行n列的矩阵 而小渊和小轩被安排在矩阵对角线的两端 因此 他们就无法直接交谈了 幸运的是 他们可以通过传纸条来进行交流 纸条要经由许多同学传到对方手里 小渊坐在矩阵的左上角 坐标 1 1 小轩坐在矩阵的右下角 坐标 m n 从小渊传到小轩的纸条只可以向下或者向右传递 从小轩传给小渊的纸条只可以向上或者向左传递 在活动进行中 小渊希望给小轩传递一张纸条 同时希望小轩给他回复 班里每个同学都可以帮他们传递 但只会帮他们一次 也就是说如果此人在小渊递给小轩纸条的时候帮忙 那么在小轩递给小渊的时候就不会再帮忙 反之亦然 还有一件事情需要注意 全班每个同学愿意帮忙的好感度有高有低 注意 小渊和小轩的好心程度没有定义 输入时用0表示 可以用一个0 100的自然数来表示 数越大表示越好心 小渊和小轩希望尽可能找好心程度高的同学来帮忙传纸条 即找到来回两条传递路径 使得这两条路径上同学的好心程度之和最大 现在 请你帮助小渊和小轩找到这样的两条路径 第三题传纸条 输入格式 输入文件message in的第一行有2个用空格隔开的整数m和n 表示班里有m行n列 1 m n 50 接下来的m行是一个m n的矩阵 矩阵中第i行j列的整数表示坐在第i行j列的学生的好心程度 每行的n个整数之间用空格隔开 输出格式 输出文件message out共一行 包含一个整数 表示来回两条路上参与传递纸条的学生的好心程度之和的最大值 样例输入 33039285570输出 34数据规模 30 的数据满足 1 m n 10100 的数据满足 1 m n 50 思路 首先想到搜索 但是对于只考虑一条路线来说 每一步有两种状态一共要走m n步 搜索整棵树的时间复杂度为O 2 m n 如果两条路线都考虑的话 时间复杂度为O 4 m n 即使是30 的数据 即m n 20 4 20 10 12 这样的数据规模也还是太大了 4维动态规划本题可以使用动态规划法解决 设f i j k l 为第一条线走到 I j 第二条线走到 k l 时的最优值 方便起见 两条线都看作从左上角开始 右下角结束 动态转移方程 f i 1 j k 1 l i 1 f i j k l minf i 1 j k l 1 i 1 s i j s k l f i j 1 k 1 l j 1 且 k i 1 f I j 1 k j 1 j 1 同时 由于两条线不能交叉 有k i 状态压缩因为两条路线长度相等 所以有i j k l 则状态可以压缩为三维 压缩后的转移方程为 f i 1 j k 1 i 1 f i j k minf i 1 j k i 1 s i j s k i j k f i j 1 k 1 j 1 且 k i 1 f I j 1 k j 1 关于k i 1 当k i 1时 i j 1 和 k 1 i j k 是同一点 由于两条路线不可交叉 所以两条路线的状态不可能由同一点发展而来 总结 这是一道较高难度的动规题 有一个小陷阱 如果把两条线分开做动态规划则会由于两条线路可能交叉而出错 边界条件也较为复杂 并且需要状态压缩才能拿满分 在比赛中遇到这种题如果一时无法找到合适的算法 最好先做下一题 因为即使写搜索也无法过多少数据 同时在考虑动态转移方程时一定要注意边界条件 否则极易出错 参考样程 include defineI F message in defineO F message out usingnamespacestd shortn m shorts 60 60 longf 60 60 60 voidInput longmax longa longb voidDyna voidOutput intmain Input Dyna Output return0 voidInput shorti j ifstreamfin I F fin n m for i 0 i s i j fin close voidOutput ofstreamfout O F fout f n 2 m 1 n 1 endl 不要输出f n 1 m 1 n 1 正确的方程是不会计算这个状态的fout close longmax longa longb if a b returna elsereturnb voidDyna shorti j k for i 0 i n i for j 0 j m j for k i 1 k i j k if k i 1 需要格外注意边界条件if i 0 f i j k f i j 1 k s i j s k i j k elseif j 0 f i j k max f i 1 j k f i 1 j k 1 s i j s k i j k elsef i j k max max f i 1 j k f i 1 j k 1 f i j 1 k s i j s k i j k elseif i 0 f i j k max f i j 1 k 1 f i j 1 k s i j s k i j k elseif j 0 f i j k max f i 1 j k f i 1 j k 1 s i j s k i j k elsef i j k max max f i 1 j k f i 1 j k 1 max f i j 1 k 1 f i j 1 k s i j s k i j k 第四题双栈排序 问题描述 Tom最近在研究一个有趣的排序问题 通过2个栈S1和s2 Tom希望借助以下4种操作实现将输入序列升序排序 操作a如果输入序列不为空 将第一个元素压入栈S1操作b如果栈S1不为空 将Sl栈顶元素弹出至输出序列操作c如果输入序列不为空 将第一个元素压入栈s2操作d如果栈S2不为空 将S2栈顶元素弹出至输出序列如果一个l n的排列P可以通过一系列操作使得输出序列为l 2 n 1 n Tom就称P是一个 可双栈排序排列 例如 1 3 2 4 就是一个 可双栈排序排列 而 2 3 4 1 不是 下图描述了一个将 1 3 2 4 排序的操作序列 当然 这样的操作序列有可能有多个 对于上例 1 3 2 4 是另外一个可行的操作序列 Tom希望知道其中字典序最小的操作序列是什么 输入格式 输入文件twostack in的第一行是一个整数n 第二行有n个刚空格隔开的正整数 构成一个1 n的排列 输出格式 输出文件twostack out共一行 如果输入的排列不是 可双栈排序排列 输出数字0 否则输出字典序最小的操作序列 每两个操作之间用空格隔开 行尾没有空格 数据规模 30 的数据满足 n 1050 的数据满足 n 50100 的数据满足 n 1000 样例1输入 41324输出 abaabbab样例2输入 42341输出 0样例3输入 3231输出 acabbd 分析 输入的数据一定是1 n的整数且不会重复 因而对于给定的n 其排序后的序列一定是1 2 3 n 进一步可以推出两个栈中的元素一定是越靠近栈顶越小 根据这种想法 我们可以制定一个贪心策略 当输出序列中已有m个数时 在每次操作之前进行一次判断 如果数字m 1仍在输入序列中 那么本次操作一定入栈 当入栈的数不为m 1且该数比两个栈的栈顶元素都要大时无解 否则入栈 若两栈都能入则入1栈 如果m 1已在栈中则出栈 该元素必定在栈顶 这种贪心可以通过全部数据 但是是错误的 对于这个输入序列 5724163 贪心所得出的操作序列并不是字典序最小的 正确解法首先要判断是否有解 设输入序列为S S i S j 两个元素不能进入同一个栈 自始至终不能进入同一个栈 存在k 满足i j k 使得S k S i S j 证明略 把每个元素按照输入序列中的顺序编号 看作一个图中的每个顶点 这时 我们对所有的 i j 满足i j 判断是否满足上文结论 即S i S j 两个元素能否进入同一个栈 如果满足 则在i j之间连接一条边 由于只有两个栈 所以连完之后得到的图必须是二部图 否则无解 动态规划优化由于需要枚举i j k三个指针 时间复杂度为O n 3 较大 这原因在于过多得枚举了k 我们可以用动态规划把枚举k变为O 1 的算法 设F i 为Min S i S i 1 S i 2 S n 1 S n 状态转移方程为F i Min S i F i 1 判断数对 i j 是否满足条件 只需判断 i j且S i S j 且F j 1 S i 即可 时间复杂度为O n 2 染色模拟接下来我们对图染色 由于由于要求字典序最小 即尽量要进入栈1 我们按编号递增的顺序从每个未染色的顶点开始染色 相邻的顶点染上不同的色 染色结束后我们就得到了每个元素所进的栈 接下来进行模拟即可得到正确的解 总结 这道题虽然正确的解法不容易想到 但是较好的贪心策略亦可以拿到不少的分甚至拿满分 因此在比赛中遇到此类模拟题如果还有时间一定要试一试 搜索或者贪心都可能会过不少数据 参考样程 include defineI F twostack in defineO F twostack out usingnamespacestd intn ints 1000 r 1001 r记录每个元素所对应的编号intmap 1000 1000 0 记录图 邻接表 map i 0 记录与i相连的边数 shortc 1000 记录颜色 即每个元素所进的栈 charans 2000 操作序列boolflag true 记录是否有解voidInput intmin inta intb voidPaint Color intx 染色过程voidPaint 判断是否有解voidSearch 模拟计算操作序列voidOutput intmain Input Paint if flag Search Output return0 总结 这次比赛的一等奖分数线是250分 对于题的难度而言还是比较容易拿到的 前两题细心点200分没有问题 后两题连搜带贪50分应该也不是很难 主要是看大家比赛时的细心程度 第一题需要把输出的单词首字母大写 第二题搜索的上界 第三题的动归边界状态 都是需要细心观察 思考才不容易出错的 因此在比赛中切不可

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论