写给开始学习算法的自己

CF #747 (Div. 2)总结

平时的练习就好像捞薄弱项的漏勺,虽然没办法一次捞上来很多,但是捞的次数多了总会有些收获。比如今天的这场,捞出了很多平时不注意改正的不好的习惯和细节。

1.c题拖延了很多时间,错过了这次上分的关键。关键错误是两层循环的for,里面的那一层应该用j的用了i,导致判断的不是每次变化的j的情况,导致出错。平时写代码时大多数情况都只需要一层循环,写顺手了i往往导致写j时非常不习惯。除了循环内的变量,内层for条件语句里的j因为for语句配合i写得多,也常常写串门,导致出错。

这种bug往往具有隐蔽性,很难一下子检查出来。进入算法学习阶段的写手会较为注重算法是否出错,很容易遗漏书写标准上的错误。在这个阶段,有时候线段树的pushup写错了能一眼看出来,而一个双=写成=,int相乘溢出,变量名函数名写错要检查几十分钟甚至几个小时才能发现。

刚入门时帮其他专业的朋友们debug,往往一眼就能找出错误,然而学习算法久了之后,帮朋友debug却变得麻烦起来。因为我往往会只关注他们的算法部分,其实对于朋友们,更容易出错的是语句规范问题。

今天的bug交给新手来解决,说不定只需要很短的时间,这值得自己反思。在更多关注算法的阶段,出现这样的错误无疑是致命的。一道签到题最怕的就是这样的错误,在紧张的情况下如果出这样的纰漏,很难像读错题一样一瞬间看出错误,往往需要5分钟以上的时间,对于签到题已经拉开差距了。

一是需要不断的优化自己的习惯,发现了就要及时改正,下次写的时候重点关注出错的地方。而不是知道了那里容易出错,还是随意打,打完了如果出错再修改。容易出错的地方一定要在写之前做好准备,慢慢的养成写出正确代码的习惯。

二是在debug时多动动脑筋,更注重灵活,多方面。算法部分的bug看过一遍了,再看一遍就不要再盯着看,注重别的可能出现bug的地方,多方面的debug。比如签到题时出了这样的错误,多留心眼也是可以的。多方面的debug,至少在出错的情况下,可以尽可能缩短debug时间。

2.E1有一个比较有代表性的惯性思维错误。关于取模运算了解的并不多,上次也出了除法取模的错误。取模需要注意的是减法取模,要加上模数以防结果为负,以及除法取模a/b取模等于a*(b的mod-2次方)取模。

今天出的错误比较魔幻,是指数取模了。比赛结束清醒之后觉得很荒唐,但是比赛时对于不了解的运算,则很容易惯性思维,没有减法也没有除法,一下子放松了警惕全部取模。检查时甚至看出来指数取模,也先在心里暗示自己的代码是对的,也不会觉得是错的。因为惯性思维了,会认为近期自己的想法是理所当然的,已经跳过了理性思考的部分,放弃了思考。

要解决这样的错误首先是增加自己的知识,增加更多的正确的思维,这样出来的惯性不容易偏离太多。并且需要不断地审视自己的代码,从底层思考起。

除此之外还有函数名写错的bug,为了将指数取模改为不取模,直接将qpow(quickpower)函数中的取模去掉了,改了函数名为_pow,但是return中的qpow却没有改名,比赛结束了才检查出来。比赛时只集中看了取模到底是哪出错了,名称出错的地方也只是一眼扫过。以后要更注意书写的规范,修改的规范和严谨。

3.b是惯性思维拖延,一开始主观上认为应该分组,每组个数不断加1,容易发现这样的方法行不通。在之后发现了第n个和二进制01有关时,先找出目标在第几组的惯性思维遗留了下来,为了找出组数花费了时间,其实可以一口气用通解解题。惯性思维浪费了时间。

4.签到题,阅读速度和思考进入状态较慢。灵光闪过了但要思考一下转换成语言花费了时间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值