收藏 分享(赏)

电子科技大学第五届程序设计竞赛初赛题目分析.doc

上传人:qcjlxh 文档编号:4344568 上传时间:2018-12-24 格式:DOC 页数:5 大小:45.50KB
下载 相关 举报
电子科技大学第五届程序设计竞赛初赛题目分析.doc_第1页
第1页 / 共5页
电子科技大学第五届程序设计竞赛初赛题目分析.doc_第2页
第2页 / 共5页
电子科技大学第五届程序设计竞赛初赛题目分析.doc_第3页
第3页 / 共5页
电子科技大学第五届程序设计竞赛初赛题目分析.doc_第4页
第4页 / 共5页
电子科技大学第五届程序设计竞赛初赛题目分析.doc_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

1、电子科技大学第五届程序设计竞赛初赛题目分析刘歆这次题目整体难度不高。相对于我们估计的电子科大同学的平均水平,题目设置了六道简单题,三道稍难题,一道较难题。比赛结果和预期的很接近。通过=7 道的有 22 个队,=6 道的有 34 个队,=5 道的有 50个队。应该说,过 7 题的同学,特别是还在大一 大三的,是相当不错的。过六题的同学也已经达到了我们之前对于晋级决赛水平的预期。过五题的同学基本功是不错的,如果还是低年级(大一 大二) ,具有相当的培养潜质。但是也应该看到差距和不足。首先,比赛是 12 个小时。比赛延长为 12 个小时其目的是为了让更多时间冲突的同学能够有机会参加比赛。但一个 AC

2、M/ICPC 平均水平的专业队员能够在 5 小时内做 910 道。尽管不少队伍在短时间内做出了不少题目,但是在余下的时间内他们并没有更多的扩大战果,说明大多数队伍在对付稍难题目时仍然力不从心。川大的一位同学从中午才开始做就能够排名第二,说明我们学校的同学还有差距。只具备做简单题的能力只能算入门了,要想在 ACM/ICPC 的赛场上拼杀,只能做简单题是远远不够的。希望一些有志参加 ACM 更高级别比赛的同学抓紧训练,不要为校内赛初赛的一点成绩沾沾自喜。其次,一些相对容易的题目做出的同学较少。第一个题目是 E Restore Equations。这个题一看就知道是枚举两个乘数再检查是否满足,程序也

3、非常好写,但是尝试的同学很少。这个题目和 Google Code Jam China 2006 第二轮的 500 分类似。而那场比赛的整体难度是较低的。这说明同学的基本功还不扎实,做的题还不够多。第二个题目是 G homework。这个题其实是个很常见的类型。经常在 OJ 做题的同学应该能够很快搞出。这个题和 TopCoder 一次 SRM 的 250 很相似,不过那次那个题规模很小,可枚举。不过很遗憾,尝试这个题和做对的同学都不多。而且竟然有集训队队员提交了很多次,这个题只要想对算法,代码是很简单的。下面我给出每个题的简要分析。考虑到广大同学第一次阅读此类解题报告,我会稍微写得详细一些。但是

4、基本上仍然是点到为止,细节和某些正确性证明留给同学们。数学学院上( )可以下载标程和数据,并且天大的题库里面你也可以继续提交。题目 F Fishing 和 G homework 是文成明同学出的,其余题目是我出的。题目难度系数以(*,*,*)分别标示我们认为的简单题、稍难题和较难题。Problem A A Simple Game 难度:*这个题并不是那么容易,确获得了同学极大的提交热情(289 次提交!) ,很让我吃惊,看来同学对博弈类问题还是很有兴趣的。可惜这个题不是个博弈题,而是个数学题。很容易想到,那些(a,b)互素的位置是一定要按的,而这样做了以后,所有(a,b) 有大于一的公因子的位

5、置都被按了恰好一次(被(a/d,b/d) ,其中 d 是 a 和 b 的最大公约数)。那么问题转化为,对于 1N 的每个 k,有多少个 Ti+1/Wi+1。交换 i 和 i+1 不会影响 i 之前和 i+1 之后的作业的Wk*Ck。假设 i 之前的作业总时间是 T,那么交换之前 i 和 i+1 的 Ck*Wk 之和是:S1 = (T+Ti)*Wi + (T + Ti + Ti+1)*Wi+1交换后是:S2 = (T+Ti+1)*Wi+1 + (T + Ti+1 + Ti)*Wi由假设 Ti/Wi Ti+1/Wi+1,得到 S1S2,即交换后我们会得到一个权值和更小的序列,与原序列是最优序列矛盾

6、,故原命题得证。这个题其实是作业调度中的一个经典问题。如果所有 Wk=1,那么我们得到结论,按处理时间从小到大来处理作业,这样的完成时间之和最小。这个题只通过了 18 个队,和预期差不多。H The Heroes 难度: *“送分题”之一。我在讲座中反复提到子串问题,这次也出了一个。但是很多同学好像被题目吓住了,一开始尝试的同学很少。其实我在讲座中强调过,一个题不一定需要用最优算法来解决,这就是一个例子。我们不妨来算算复杂度:判子串,用最朴素的算法,复杂度是 50*50。有 50 个文本串,每个要用 10 个模版串去匹配,总复杂度是 503*10=1.25*106 107。一般来说,106 次

7、左右操作 1 秒内可以毫无问题的做完,而且判字符相同的操作是很廉价的。但是有一点要注意,最好不要使用库函数中的 strcmp,这个函数由于未知的原因很低效。应该用 memcmp 替代,或者自己写一个判字符串相等的函数。那么这种问题快一点的算法是什么呢?可以使用 KMP 算法(算法导论和算法艺术与信息学竞赛上有讲) ,把判子串降为 O(L)的复杂度,总时间是 O(N*M*L),其中N,M,L 分别是文本串个数,模版串个数和串长。更强的做法是利用 Trie 在 O(M*)时间内建一个多串匹配的自动机,然后每个文本串都可以在 O(L)时间内完成匹配,总时间是O(M*L+N*L)。这个题最后有 53

8、个队通过。Problem I I am Lord Voldemort 难度:*这个题本来是想出难一点的,就是找出字符串集合中可以相互转化的所有等价类。后来改成只需要判两个串能不能相互转化。两个办法:1) 统计字符出现的次数,完全相同的可以相互转化2) 把两个串自身排一次序,然后检查两个串是否相同两种方法都很容易实现,但是第二种方法可以很容易的推广到我们原来那个更难的问题:给你许多串,把所有串划分成一些集合,其中每个集合中的字符串都是可以通过排列转化的。同学们可以思考一下怎样推广。这个题最后有 64 个队通过。Problem J Amicable Pairs 难度:*这个题出好以后发现比预想的难

9、了一些,主要是又要涉及到一些数论的知识,并不是每个队的同学都学过。我们的方法是先求出所有=105 数的约数个数 f(n)。f(n)是个积性函数,即满足 f(n) = f(n1) * f(n2),其中 n=n1*n2 且 n1 和 n2 互素。那么和欧拉函数类似,可以先算出 pk 的结果,然后递推求解。还有一个稍微慢一点但是足够解决 105 的计算约数个数方法,就是朴素的填表法,从 1 枚举到 105,对每个 k,把 k 的倍数加上 k。我试验了一下这个方法,可以 0 秒过。有几个队伍好像用的是这个方法,但是写得都很复杂。标程里面两种方法都有(分别是sol1,sol2) ,大家可以自行研究。由于 Amicable Pair 很少,也可以先在本地用低效一点的办法把所有 pair 都算出来,再打个表。最后有 34 个队通过了这个题。我查看了大家这道题的代码后,发现大部分队伍用的都是这种办法。看来大家都天才般的无师自通了 ACM 中一个屡试不爽的好方法打表法

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 通信信息 > 电子电气自动化

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报