第一题,高斯日记。A组里有这题,日期计算在论坛里不知讨论过多少次了,不再赘述。
第二题,马虎的算式。考试中这题我建议用最简单的方法暴力穷举。无非是一个两位数乘一个三位数。十万的运算量,计算机也就用一两个毫秒就搞定了,而编写这样的代码也不过一两分钟的时间。当然进一步的分析可以提高运算效率,但能缩短的时间最多也就一两毫秒。而你消耗在算法分析上的时间会是多少呢?呵呵,要学会权衡。
第三题,第39级台阶。递推题。设上到第n级台阶走奇数步的走法为a(n),走偶数步的走法为b(n)。那么,
a(n) = b(n-1) + b(n-2)
b(n) = a(n-1) + a(n-2)
边界条件
a(0) = 0 b(0) = 0
a(1) = 1 b(1) = 0
题目要的结果是b(39)
第四题,黄金连分数。考察的是大数除法,这我没什么好方法,模拟手工竖式除法。关于这个在以前我和老杨(laoyang103)有过一次专门的讨论,帖子中我给出了一个通用的大数除法函数。不过这题里分子总是1,所以可以简化计算过程。需要注意的是为保证足够的精度实际计算时要比要求的多算几位,不必太多,这题多算两位就足够了。
第五题,前缀判断。就不解释了。*(haystack++) != *(needle++)
第六题,三部排序。我好像在论坛里贴过类似的ACM题目的代码。p++
第七题,错误票据。也是A组题里的题目,不再赘述。
第八题,翻硬币。按如下规则统计就可以了。原理相当于解一个线性方程组,在论坛中我写过一篇详细讨论关于点灯游戏的贴子,和这个问题原理相同,不过更复杂,那是个二维平面内的矩阵,翻转一个位置会同时翻转与它相邻的上下左右四个位置。有兴趣的可以找找那个贴子。
具体步骤:
从第一个硬币开始,对比目标状态相应的位置,如果不同则翻转这个硬币(这个动作其实可以省去)及下一个硬币,统计一次翻转;如果相同则转到下一个硬币。
当转到最后一个硬币时与目标状态不同,则这组序列无解,即无论如何不可能翻转成目标状态。如果相同则有解,解为之前统计的总和。当然,题目给出的序列应该是都有解的。
第九题,带分数。呵呵,考试中也建议使用暴力穷举。但别从0到987654321穷举,题目是有时间限制的,3秒钟完成不了9亿多次运算。这个要配合全排列来做,在每组全排列中再选两个位置插入加法运算和除法运算。运算量是9! * C(8,2),千万量级,可以满足性能需求。而且这个过程中由加号分割的左半段不能超过目标值,由除号分割的左半段长度不能小于右半段,即除法的结果不能小于1。由这两个条件剪枝还可以进一步减少运算量。综合判断总的运算量估计在百万量级,应该可以在1秒内完成。
第十题,连号区间数。分值最高的题,也是最难的题。目前我也没什么更好的思路,只能一个区间一个区间的统计。这里可以利用一个条件加快统计速度:当一个区间中的最大值与最小值的差等于区间的长度减1时,它必是一个连号区间,否则不是。先把这些发上来,我再想想,也期待看到众坛友的好方法。