于看完了那一大篇的说明和注意事项许毅便开始看题。试题的通常格式是“题目描述”然后是“输入文件”“输出文件”最后还会给出几个样例数据。总共有四个大题。每题对应一个源程序源程序要能够符合题中给出的样例当然也得符合其他合法数据。另外还对程序的运行时间和效率有规定。
这几个题目对许毅来说实在是没有任何挑战很快他就做到了最后一题:无聊的排序。
题目为:你弟弟有一项家庭作业需要你帮助完成。老师给了他一列数需要他把这些数按升序排列。你可以每次交换两个数的位置而一次交换的代价被定义成被交换的两个数的和。写一个程序用最小的交换代价来帮助弟弟完成这项无聊的排序工作。
输入:第一行为一个数n(n《=1oo)第二行为互不相同的n个数。
输出:输出一个数。为最小的交换代价和。
稍看了一眼许毅就知道本题可以抽象为:把一列数从初始状态变成目标状态即完成一个置换。根据群论知识置换可以分解为n个不相交的循环的乘积。显然由于每次只有被交换两个数的位置改变所以要想改变一个数的位置只能通过交换完成而不能像插入排序一样可以借助其他数来完成即各个循环是相互独立的所以应该依次完成每个循环。为了得到尽量少的交换代价在每个循环中较好的方法是让循环中最小元素或全局中最小元素参加所有的交换。至于用循环内的最小元素还是用全局中的最小元素就要比较哪个交换代价更小了。将它作为压轴题相信对高中生或初中生来说难度应该很大吧可在许毅面前已经变得和“he11oor1d”程序那样容易。
在脑海中想好怎么编写许毅调出gcc一口气就将这个算法给编写出来了。把测试数据代入试了几次改动了几个小错误大功告成!看了看周围的同学有的在奋力输入有的则在仔细读题每个人都是一脸认真严肃的样子。再侧了身子看了看前面两排的黎姿姿现她在用笔在稿纸上画着什么。而她不远处的李帅则有些挠头搔脑的好像很不安份的样子。
呵呵看你这关怎么过。许毅正东张西望结果被监考老师看到了她走了过来。
“同学请不要到处乱看。”
得她还以为我想作弊呢。
“哦好的可是我已经做完了。老师我交卷。”说完不理一脸惊异的监考老师就走了出去。当然后面跟着地还有一大片羡慕、崇拜、嫉妒的目光。
来到外面许毅想到就这么回去肯定又会被柳叶说于是他转而向一中的校外走去。好不容易来