碎碎念——刷算法题的日子(1)

开学一周,进入了刷算法题的阶段,用一周的时间完成了洛谷新手村的任务(感觉自己蒟蒻),适当进行一下总结,之后会尽量保持一周一次总结的习惯。
新手村大部分都是些基础题,就算是赛前热身的阶段,感受一下敲代码,有技巧和难度的题也有,但是不多,下面就说几点自己的坑。

条件判断的顺序

第一次深刻感受到 ||&&的影响之大。在一个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
我会继续努力的!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值