代码改变世界

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

2007-03-02 20:37  老博客哈  阅读(1372)  评论(4编辑  收藏  举报

                                                 东南大学2004年第一届逻辑算法大赛初赛解题报告

                                                                                      农夫三拳@seu
                                                                                      drizzlecrj@gmail.com

    无意中从硬盘中找到了这个东东,就随手做了一下。这是计算机系大牛一手搞的一场类似ICPC的比赛。初赛的题目还是比较简单的,下面简要做一个说明:

    第一题 Simple Addition
         此题是高精度加法, 没什么好说的。
     想要交的可以试试这题http://acm.hdu.edu.cn/showproblem.php?pid=1002 都是大整数加法

    第二题      Cards
         这个题目用三个栈递归模拟可以打印所有解。其实这个序列的个数就是组合数学中的Catalan数,也就是
    (2n)! / (n! * n! * (n + 1))
         关于Catalan数目的技术问题可以做做 http://acm.hdu.edu.cn/showproblem.php?pid=1023
         另外一道和本题有点类似的题目是http://acm.zju.edu.cn/show_problem.php?pid=1004

    第三题 Back To Dos
 字符串处理,简单题。可以先行把CD给除去,这样就避免了空格问题了。
 类似的题目见http://acm.pku.edu.cn/JudgeOnline/problem?id=1028

    第四题 Smith Number
        这个题目不是很难,稍微有点思考的地方就是素数表要存储多大,其实存储到sqrt(n)就可以了。
    可以这么想,质数因子最多只可能有一个数超过sqrt(n)(可以用反证法证明),因此只要不断的用sqrt(n)范围的    素数对n进行试除,最后n要么等于1,要么是一个大于sqrt(n)的素数因子,这个是为什么呢?原因同样可以用反证法    予以证明,首先余下的数要么是1,要么比sqrt(n)大肯定没问题吧!假设余下的因子是合数,那么它的分解质因数一定    是两个大于sqrt(n)的素数,因此矛盾。故最后剩下的一定是素数。
    此题与http://acm.pku.edu.cn/JudgeOnline/problem?id=1142类似。

    第五题 Is There Any Prefix ?
        我是直接使用STL的search搞的,其实自己写的话可以构建一棵二叉树来进行模拟
     此题的判断前缀的问题与http://acm.pku.edu.cn/JudgeOnline/problem?id=1056类似。
   
    第六题 Oil Detecting
        此题与http://acm.pku.edu.cn/JudgeOnline/problem?id=1562
        http://acm.pku.edu.cn/JudgeOnline/problem?id=2386几乎一样,只改了几个符号。
    这个题目可以使用深度优先搜索(dfs)或者广度优先搜索(bfs)解决。

    第七题 Mining
        seu的版本换成中文好理解点了,原题英文最后output的几句话很费解。
 见http://acm.pku.edu.cn/JudgeOnline/problem?id=2612 直接模拟就可以搞定了

    第八题 Digital Display
        模拟,放在二维的字符数组中弄弄可能稍微简单一些,细心一点控制好格式就可以了。
    这题和http://acm.pku.edu.cn/JudgeOnline/problem?id=1102非常类似,大家可以试试

    第九题      Sorting
 这个题目用STL的set可以很简单的搞定。标程用了诡异的做法,将一个数拆成32x+y的形式,然后用数组索引存储x,值存储1<<y

    第十题 Recursive Function
        递归转非递归,可以使用record table。
        此题与http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1003&cid=46一样。

    第十一题    Variable Definition
       模拟,只要将左端是否分配的情况保持与右边一样就可以了。
       和http://acm.stu.edu.cn/cgi-bin/problem?id=3002一样

    第十二题    Josephus Permutation
       约瑟夫问题,由于此题仅要求最后一个出圈的人,所以使用约瑟夫问题的数学解法是一个良策(标程使用的是双端链表模拟)。
    有两种思考方式:
     第一种可以这样,假设n个人中循环报数m,第一个出去的人的序号为k,那么剩下的人为
    1 2 3 ... k - 1 k + 1 ... n, 我们将从k+1开始的数映射成1, 则k+2对应2, n对应n - k, 1对应成n - k + 1
     k - 1对应n - 1,那么现在的问题变成了已知n - 1个人进行循环报数m,求出去的人的序号。假设已经求出了n - 1个人循环报数
     下最后一个出去的人的序号x,那么它在n个人中的序号应该为(x + k - 1) % n + 1,其中 k = (m - 1) % n + 1,化简一下就是
    (x + m - 1) % n + 1, 这样就可以通过只剩下一个人出圈序号1不断的向上推导得到结果了。
     第二种可以这样,最后一个出去的人的序号肯定为1,那么它在还剩下两个人时的时候一定是出圈人后面报1的人。同样,在两个人
     时出圈的人k一定是在三个人时出圈的人后报k的人,依次下去,可以推导出上述一样的结论。
     pku上我暂时遇到了两题与Josephus有关的题目。一道和本题一样,http://acm.pku.edu.cn/JudgeOnline/problem?id=2244
     另外一道见http://acm.pku.edu.cn/JudgeOnline/problem?id=1012

试题下载      
我的解决方案
由于数据太大,无法上传,需要的朋友请与我qq联系
281845569