题单里面有 14 道题,要求做至少 10 道。由于我是个大摆子,就挑了 10 道分次做,每次从容易的做到难的。但由于太久没有网瘾,有些难度为「普及-」的题我都需要很久才能产生思路,但也有小蓝题能快速切出来,可能我思路比较清奇。这次主要是记录一些我个人常犯的错误,这样以后印象稍微深刻一些。
P1618 三连击(升级版)
这题其实直接枚举一个数据就行,我枚举了三个,显得非常小丑。当时看算法复杂度对就直接写了,还是需要提高对某种「变量之间的关联」的敏感度,找到求出一系列变量的最简路径。
同时这题被 的数据搞了一发,我的评价是有点傻呗。理论上对于每一题把每个数据的上下界自己代入一边能避免大部分此类错误。
P1217 回文质数 Prime Palindromes
写的我相似的一题,看题解似乎是直接枚举所有数据判断回文快一些,但我选择了最朴素的把每个数位和试一遍的写法,因为写通用的不知道为什么死多 bug.
同时直接暴力根号复杂度判素数判不了,如果发现不了回文质数的范围实际上很小也没法用埃氏筛或者欧拉筛把所有质数打出来,需要结合这两种方法,判断出根号数量的质数然后用这些判上亿级别的大数。
P1913 L国的战斗之伞兵
被 switch case
没加 break
坑了一发(这个错误看起来非常新人,很符合我的实际水平),因为题意理解也寄了一发。我当时以为即使被吹到漩涡里面也合法,不过题目有说要被挂到无风区才行。
P1058 立体图
很抽象的一题,看题解里面可以把立方体的图案先画出来,然后写个程序去分配到画布的各个地方,但我选择了简单直接的写三十多行代码一个一个字符画的方法。
P3952 时间复杂度
WA 15 发的一题,相当多细节,例如循环的起点可以比终点大,占用的变量名循环结束后要删掉……因为从匿名函数版本重构而来,我当时遇到了一堆混淆临时变量和全局变量的问题。最傻呗的是,里面夹了一个没有 break
的 switch case
, 调到最后才发现!
这题的递归逻辑不是很好想,我是选择等效于外面又套了一层循环,这样里面以一个单位调用的时候就可以统一循环结束的处理逻辑。这么说可能比较抽象,更具体地,我写的函数是用来处理类似于 unit = F unit F unit ... F unit E
这样子的结构,保证每个 F 启动一个 unit
, 每个 unit
最后是 E 触发结束。这样最外层还需要特判没有 E 才是正常情况。其实如果写成 unit = (F unit E) * n
的形式会更好一些,特判少一点,现在从马后炮视角来看就比较清晰。
当时想着变量名的占用数组反正搜索完会清空,就没有手动清空。后来发现还有错误的可能,错误的时候就清不空,所以有些时候还是手动清空一下保险一点。
P1582 倒水
简单题,经过一些乱试之后可以发现如果把原先的水份数用 1, 2, 4, ... 的和来表示,那么每一份都最终收缩成一杯水,并且彼此之间不能合并。这对应的就是数字二进制表示中 1 的个数,所以最后求的是 n 最少加上多少才能使其里面 1 的个数小于 k. 我的思路是找到这个数字高位的前 k 个 1,如果后面全都是 0 就直接结束,否则一定要把这个 1 变成 0 才行。例如, 时,要让第四位 1 变成 0, 最后的结果显然是 .
题解中有个巧妙而简明的算法是直接贪心地给最小位 1 补成 0, 写起来比我这种简单一些。可以使用函数 __builtin_popcount(n)
来实现统计数字二进制表示中 1 的数量,但我还是用了 bitset
.
ARC079E Decrease (Judge ver.)
一个很抽象的题,需要考虑到一个数只要不小于 n 就一定会被减,然后就能过了。是一道通过率非常高(但我 TLE 了一发)的题目。
总结
switch case
要 break
!