开学一周,进入了刷算法题的阶段,用一周的时间完成了洛谷新手村的任务(感觉自己蒟蒻),适当进行一下总结,之后会尽量保持一周一次总结的习惯。
新手村大部分都是些基础题,就算是赛前热身的阶段,感受一下敲代码,有技巧和难度的题也有,但是不多,下面就说几点自己的坑。
条件判断的顺序
第一次深刻感受到 ||
和 &&
的影响之大。在一个if判断语句里,如果有多个条件的话,很有必要考虑一下哪个条件在前,哪个条件在后,因为这个行为很有可能省去你大量的时间,就像我在做回文质数时,一开始把判断素数放在了前面,导致总有三个点TLE,捣鼓半天之后发现先判断回文数就可以AC了,瞬间。。。至于原理的话,因为
判断回文数时使用的是制造回文数然后判断,并且最大的回文质数是9989899(别问我为什么是,问就是不知道),在数据量过大时能省下时间。
在加上其他一些特殊条件,减去了一些判断,就顺利AC了。
勤用visit[]
看着是visit[]
,其实就是个用来判断状态的数组,bool或者int看你了。像在三连击、选数里,利用一个visit[]数组记录一个数的使用情况会让你思路清晰很多,当然我相信这些题还有更高级的解法,只是我暂时不会,哭!
多元思维
这个多元,指的不仅仅是一题多解,还可以是一个函数的多种写法,像是判断素数isPrime
,正常情况下你可以这么写:
bool isPrime(int n){
if(n < 2){
return false;
}
if(n == 2){
return true;
}
for(int i = 2;i < sqrt(n)+1;i++){
if(n%i == 0){
return false;
}
}
return true;
}
不过当你知道题目要求的n是大于2甚至大于9时,你又可以写成:
bool isPrime(int n){
int i;
int x = sqrt(n);
for(i=3;i<=x;i++)
if(n%i==0) return false;
return true;
}
秉承能省就省的原则。
还有特殊情况下常用算法的修改,像在做陶陶摘苹果时,在需要实现贪心时,我就把快速排序稍微修改了一下,根据一个数组的情况来调整另一个相关的数组(你也可以选择用一个二维数组),代码不常用就不贴了,总之做题一下就舒服了。
题意的理解
这个放在后面,压轴的,因为我觉得这是最基础也是最重要的一点。在拿到一道题目的时候,我们首先要做的就是理解题意,只有在理解的基础上你才能知道下一步要怎么做,像数的计算和Cantor表我刚看到的时候就一脸懵,搞不懂它要干嘛,后来才发现是我理解错了题目中的一些信息(偷窥了题解以后),瞬间有了思路,在几次WA之后通过了题目;在理解题意的同时,你还要注意到题目中的一些特殊点(临界,不限于临界),这些点很可能就是你通过不了的点,我有几次就是因为0爆出了WA的点,然后根据特殊点,还可以帮你找规律,排除部分数据,实现更高效的代码。
最后放下自己写的代码,大部分都比较简单,就没写注释了,有问题评论也可以 ^_^。
https://github.com/LongHongPing/AlgorithmPractice/tree/master/ccf_lg
我会继续努力的!!!