代码改变世界

东南大学2005年程序设计第二届初赛解题报告

2007-03-14 14:46  老博客哈  阅读(2925)  评论(14编辑  收藏  举报

                                           东南大学第二届程序设计竞赛初赛解题报告
                                                                                                  农夫三拳@seu
                                                                                                  drizzlecrj@gmail.com
        记得这届比赛开始的时候,我还大一,当时C++刚学,没记错的话刚好是期中考试的时候,就和YT俩信誓旦旦的报了名,最后很不幸由于一些输入的问题搞错,只有唯一一题只打印的问题作出来了,好像由于**原因,被扣了一分,惨就一个字。今天我又回来了,为当初的Aeolus队报一箭之仇,再会会这么几道题目。
    好了,废话少说,切入正题:

第一题 MOD 9  (http://acm.stu.edu.cn/cgi-bin/problem?id=1136)
 这个题目很有趣吧,简单观察一下,可以发现一个整数各个位上的和对9取余的结果即是该数对9取余的结果。类似的有若一个数每个位上的数的和能被3整除,那么该数能被3整除,更多有趣的知识请见我以前整理过的一篇帖子http://www.e-mu.cn/bbs/read.php?tid=2262&keyword=%CA%FD%C2%DB ACM中什么题目都有,相反的问题可不是好这么简单的看出来了,Digit Roots正是这样一个问题http://acm.pku.edu.cn/JudgeOnline/problem?id=1519 现在你有了一个更好的解决这个问题的方法了。如果您一定要问我这个如何证明,那么就简单的说明下吧:
 n为一个整数,不妨设n>=0,那么n可以写成∑10^i*ni的形式了,简单举个例子, 12340 = 1 * 10^4 + 2 * 10^3 + 3 * 10^2 + 4 * 10^1 + 0 * 10^0  由于10^i次方对9取余的结果一定为1,(这个不用证明了吧,:-)),根据同余定理,不能得到上面对9取余的结果等于各个位数的和对9取余的结果。得证!

第二题 GREEDY SNAKE  (未找到非常类似的题)
 说到贪吃蛇,那可一定要先做做这个简化版本的 http://acm.zju.edu.cn/show_problem.php?pid=1056 这里面的蛇是固定大小的,没有食物,只有命令序列控制它的移动。另外一个相对难一点的贪吃蛇是http://acm.pku.cn/JudgeOnline/problem?id=1324 福建的钱自强写过解题报告。这个题目有个很强的剪枝,如果没有蛇身在蛇头之上,并且存在某条最短路径上没有障碍物,那么就可以直接得到结果了。

第三题 Box Moving   (http://acm.pku.edu.cn/JudgeOnline/problem?id=1475)
 本题一个数据范围较小的原型题目见http://acm.zju.edu.cn/show_problem.php?pid=1675, 做法都可以使用双重bfs,先bfs箱子的位置,然后bfs人的位置。另外一个比较相似的题目是pku1475,这个题目看起来和zju1675很像,做起来却不是那么顺利,我至少tle了十几次。方法仍然可以使用bfs,关键在剪枝上,要存储状态的最优值,当当前的状态没有最优值优的时候,可以直接略去。具体可以看Zc blog上的解题报告: http://zhangchi.yculblog.com/post.603913.html

第四题  Argus   (http://acm.pku.edu.cn/JudgeOnline/problem?id=2051)
 这是2004年北京赛区的一个题目。由于OJ的数据较弱,简单的暴力都能过。初看这题我有很多想法,刚开始往最小公倍数数上想了,后来又想把所有范围内的解存起来,然后排序,结果MLE。正确的比较高效的算法可以维护一个最小堆,不断的取最小值,然后将其进行更新。
建堆的时间复杂度是O(nlogn),n为指令数目。操作过程的时间复杂度为O(k*logn),k是前面产生的id个数。空间复杂度为O(n)。这个题目的原型可以见简单版本的A Set http://acm.stu.edu.cn/cgi-bin/problem?id=1166 和 Ugly Number http://acm.pku.edu.cn/JudgeOnline/problem?id=1338 ,还有http://acm.pku.cn/JudgeOnline/problem?id=2247 Humble Numbers 两者的指令分别是2,3 和 2,3,5和2,3,5,7,另外一题相关的是
http://acm.pku.cn/JudgeOnline/problem?id=2545 Hamming problem

第五题  Play On Words (http://acm.pku.edu.cn/JudgeOnline/problem?id=1386)
 这是本套试题中最出色的经典图论题了。这个题目看似和图论无关,起始将单词的首尾建立路径,会得到一个多图。此题其实就是判断其中的欧拉路径(所谓欧拉路径,就是从起点走到终点能够不重复的走遍图中所有的边,其中顶点可以多次使用)欧拉环游就是终点和起点一样。判断的方法就是图首先要连通,加上出度比入度大1和入度比出度大1的同时出现的次数不能超过1次。
其他的顶点度数为0(出度-入度)。关于判断连通,应该是此题的难点,介绍两种方法,最好的方法是使用并查集,如果连通的话,那么所有的顶点的祖先必然相同,可以进行反证,如果有一个顶点的祖先不与其他相同的话,那么就意味着该顶点到并查集祖先的路径不存在,因此不连通。还有一种方法是使用dfs进行判断。偶把dfs写成了类似查找hamilton路径了,寒一下。。(注:lrj书上有有向图欧拉路判断的详细内容)

第六题 Self Number   (http://acm.pku.edu.cn/JudgeOnline/problem?id=1316)
 这是我大一当时唯一做对的一题。从题目中可以看到任何一由n产生的数一定大于n,那么从2开始逐步往后推,肯定不会漏掉什么数,用数组进行标记一下就可以了。简单题

第七题  Climbing Worm   (http://acm.stu.edu.cn/cgi-bin/problem?id=1056)
 这题最可恶的是将人引入找公式。其实这个公式应该很难找(我是没找出来,:( )
正确的做法是模拟,核心部分应该几行就好了。

第八题  Prime Cuts   (http://acm.pku.edu.cn/JudgeOnline/problem?id=1595)
 简单题,将1000以内的素数打表。然后找到N以内的素数,接下来就按照题意该干啥干啥了。

第九题  Meeting Date   (http://acm.pku.edu.cn/JudgeOnline/problem?id=2028)
 简单题,逐一枚举所有可能的天数,统计每一天能够参加的人数

第十题  Knight Move   (http://acm.pku.edu.cn/JudgeOnline/problem?id=2243)
 又是一道简单题。不过算是BFS的一道经典题了。

第十一题  Ski   (http://acm.pku.edu.cn/JudgeOnline/problem?id=1088)
 这个题目在第一届软院算法积分赛中出现过了,可见是一个备受宠爱的经典题。
 这是一个经典的动态规划题目,先按照高度从低到高进行排序,然后不断的求出以该高度作为顶峰下滑的最大长度。 这个最大高度一定是以该点四周的比它高度要小的锁能滑的最长距离加上1。这个题目在本套试题中相对有难度,但是确是 dp题中的基本题。

第十二题  Customer Investigation   (http://acm.zju.edu.cn/show_problem.php?pid=1076)
 经典的贪心问题。证明过程说的比较好的有吴文虎的那本红皮书。注意排序时候的顺序,如果两个数的x和y存在大小关系,则顺序是确定的,否则在y相等时应该将x较小的放在前头,而y不相等则将大的y放在后面。这类题目的一个变种有 http://acm.timus.ru/problem.aspx?space=1&num=1203 此题要求连续的最长的报告会个数,但是后者的开始一定要比前者的结束大。这个题目我是先把数据预处理一下,先进行排序,然后除去结束时间相同,开始时间较小的。最后利用线段树(第一次使用,说不出的爽啊!)得到一个区间内的最大值,并进行更新,可以很快得到答案。 这里如果把题目改成可以连续的话,则题目转换成了求有向图中的最长路径,这个经过和几个大牛的讨论,可以使用拓扑排序后dp解决。


        小结一下,这次比赛的题目相比第一届整体难度有了提高,推箱子和贪吃蛇两道恶心的搜索题被安排在了题目的前半部分,这个稍有些不合理。不过从全局来看,这次的比赛题目相当有水准,考察了很多方面(虽然还不全),包括贪心,搜索,动态规划,模拟,图论,数据结构等等。这套试题估算一下,完全做完花了近一周的时间了,主要是被两道搜索题给难住了,3天写好了推箱子,后两天写完了贪吃蛇,都是5K的样子了,-_-!好了,后面有空做做colorcow大牛推荐的决赛吧!

试题下载