2015NCHU第一届ACM新生选拔赛C题题解

C.What a beautiful girl

题目定位及考察点

难度等级:C

考察点:打表的思想(空间换时间)、对算法复杂度的判断、素数判断、代码优化的意 识、快速筛选题意的能力

 

题意翻译

正在LYK、HYK、LCX苦恼于房间号码是多少的时候,一队人马出现在酒店大厅。瞬间他们三人都没心思想问题了,因为他们看到了传说中的女队,而且有一个女生还异常漂亮。“太漂亮了”“妈蛋,还让不让人想问题了”“要不拿个QQ?”“好啊好啊”然后某人就跑去拿QQ了。妹子说,“既然你也是ACMer,那就用ACMer的方式来解决吧。答对了,就可以拿到我的QQ。”妹子不可怕,可怕的是搞ACM的妹子。

给你一个数字n,找出不大于这个数字n的所有素数,并进行累加,累加之和就是所要的答案。

赶紧帮助LYK解决这道题目吧,这关系到他的终生幸福啊。

第一行有两个整数m和n。m代表有m组测试样例,范围在0到100000之间,不包括0。接下来会有m行数据,每一行包含一个整数n。N就是题目中所指的数字,n的范围在0到10000之间,不包括0。

每一组输出占一行。

 

题解思路

由于这道题的数据量有点大,如果每一次都根据n来判断素数、累加结果,那一定会超时的。而这道题的n是有个上限值10000,所以可以把10000以内的数都进行一个预处理,也就是判断10000以内的数有哪些是素数,这样只需要做一次操作,就可以省去多次判断所浪费的时间了。把这些结果存入一个数组中,也就是业界所说的“打表”。同时,我们还可以同步计算出1到i之间的素数和(i为当前判断的数),存入第二个数组中。这样,我们读取每一个数字n以后立马可以查表得到所要的结果,这个处理的时间复杂度为O(1)。

 

对新生的话

计算机对人类最大的用处就是计算,而由于在实际应用中所需要处理的数据量都会非常大,所以我们要尽量避免重复计算,这也是很多算法优化的一种思路,例如动态规划。而避免重复计算在我们ACM竞赛中用得很多的一个例子就是“打表”,也就是说,通过一次操作把接下来多次重复的计算进行统一处理,把所得结果存入数组中,这样就可以马上查表得到所需的结果了,这是用空间换时间的思想,要牢记。

然后你们还需要有时间复杂度和空间复杂度的概念,因为在很大程度上,这两者是判断算法是否足够好的一个指标,当然用得更多的是时间复杂度。其实“打表”也罢其他优化方法也罢,最终的目的就是要在尽可能短的时间内处理更多的数据,所以一定要去掌握计算算法复杂度的方法并用这个数据来衡量自己的算法是否需要改进。

最后多说一点,你们一定要尽快掌握快速筛选题意的能力。这道题你们也看到,一开始的时候一大堆废话,而这与解题一点关系都没有,纯粹浪费时间和增加一点点的趣味性。这道题无关紧要的部分还算少的了,更长的题目都有,所以你们要懂得如何快速判断哪些内容可以快速略读甚至不看,这对于增加比赛有效时间是有帮助的。

你可能感兴趣的:(ACM-ICPC)