算法分享三个方面学习方法(做题经验,代码编写经验,比赛经验)

简介: 算法分享三个方面学习方法(做题经验,代码编写经验,比赛经验)

0 . 前言:(遇到OI不要慌)(只要道路对了,就不怕遥远)



从大学0基础小白,基于刷了不完全统计大约2500道不同难度的题,到全球最强算法平台codeforces ,账号评分2347,全球排名约前1000,中国排名前200左右。


分享一下我在学习算法这几年,总结的一点心得。


题是刷不完的,掌握学习方法,才是王道。


我分别从三个方面进行讲解:


做题经验谈,代码编写经验谈,比赛经验。


1. 做题经验谈



1.1 做题的目的


做题的目的是学到新的东西以及锻炼代码能力,而不是盲目刷 OJ 的 rank,那没有任何意义。

提高算法能力(想出做法的能力,分析问题的方法等等)

提高代码能力(写出正确的代码的能力)

提高调试能力(将错误的代码改对的能力)


1.2 我对于算法比赛的题目的看法


1.2.1 类似题


对于大部分算法竞赛题目来说

大部分由于做过类似的,不用想就能解决。

之后的大部分顺着题目进行一些简单的分析,就也能转化成做过的问题。


1.2.2 套模型:


学习更多的解题模型,可能具体也可能抽象,要多加思考。


1.3 在训练过程中如何做题


选择一个好的 OJ/CF <- 优秀的题目来源

适度而不过量的思考 <- 节约时间

如果做不出来,在看了题解之后,总结自己做不出来的原因是什么,以完善

自己今后的做题方法。

做题方法是一个很抽象的概念,需要经验的积累 ( 和一定的智商? )


1.4 一些建议:提高算法能力


CF2100分的左右题目经常会有令人耳目一新的算法思路。注重解题的过程而不是罗列解法,当然由于难度较大自己做可能比较累。

而且刚刚接触的时候基本上是做不出来的吧大概 <_< 。


所以推荐的方法是看看题目不要想太多不会做就看题解。


就算自己做出来了也可以看一下题解的分析,这对提高算法能力非常有好处。


1.5 一些建议:提高代码能力


代码能力很大程度上取决于经验,你可能觉得这种可能需要大量的练习,但是其实也是有捷径的,那就是参考别人的代码。



最佳的方法是找一些可能比较难写的题目,自己很可能写不出来,这时可以参考别人的代码,搞明白那些细节都是怎么处理的,优秀的代码风格能够极大的提高代码能力。



如果是在 CF 上刷题,可以经常参考每次比赛排行榜前10的前辈的代码学习一下,他们的代码风格都很好。


1.6 选一个好的 OJ

CF 的好处:有别人代码可以参考学习,有官方题解可以看。

同时可以参考很多前辈的代码和解题报告。


1.7 分析问题的方法:我的一些经验


1. 从简单的情况开始分析:经典方法,对原题没有思路,那么分析问题的简化版。

经典例子:找出字典序最小的解,那么我们先分析怎么找出一个解。

2. 人的思维很大程度上跟关键字有关系,比如一个题目怎么想都不会,有人跟你说“容斥”,你可能瞬间就会做了,不妨列出对于这类问题已知的一些解决方法关键字,思考思考能否做。


2. 代码编写经验谈



2.1 你 50% 的代码时间基本都浪费在调试上


90% 的错误都是傻逼错误。

正确的写代码方式。


2.2 模块化


功能直接使用各自的模块。


2.3 有意义的变量名


单词的 3 个缩写

Number->num amount ->amt ,count -> cnt


2.4常见的代码错误


2.4.1 变量名打错


写代码的时候集中注意力

变量名要有意义。


2.4. 2 不完全的修改


复制粘贴一段代码的时候,急于求成,没有根据上下文改对。

复制粘贴的时候尽量注意,或者不复制粘贴使用独立的函数。

发现一个地方要改一下,这个地方可能影响很多其它的地方,没有考虑全,导致错误。

突然发现要改一个地方的时候,好好想想这里会影响哪里。


3. 比赛经验谈



3.1  对签到题要格外小心


注意细节


3.2 考场策略问题


不够冷静


3.3 心态


正确的做题顺序

正确的比赛策略

最后是以上两点导致的优秀的心态。


3.4 实力


实力碾压


3.5 策略


正确的比赛策略,没有在坑爹题上浪费太多时间,并且 AC 了一道稍有难度

的题目,之后全力确保一道很容易错的题目,并成功 AC 。


3.6 对于比赛经验的一些总结


1. 良好的心态是必须的,不冷静只会让自己水平暴跌。

2. 首先把题目都认真的看一遍,绝对不要看错题目,保险起见可以使用看两

遍的方法,确保题意是对的,不要放过任何可能重要的条件,可能只写在数

据范围里!

3. 对每一题,都使用自己平常的方法做一做,而不是看到会的就立刻去写。

这个时间每题不要过长。

4. 在此基础上决定一个良好的做题顺序。


3.7 注意事项


1. 绝对绝对绝对不要看错题目或者输入输出的格式。

2. 签到题你没 AC 别人满分你就完蛋了,绝对不要错签到题。

3. 对于可以对拍的题,一定一定一定要对拍。

4. 千万不要成为错误 ( 没删调试语句,文件名打错 )list 上的主人公。


3.8 比赛方法


3.8 .1 比赛方法 1 : 简单题


特点:题目简单,数据也弱。

面对简单题,我们需要的是稳定的 AC 。

不要求速度,先认真的看完题目,然后从容解决签到题。

然后一般来说会有一道不是那么简单的题目,先确保其它的简单题没有

问题,简单的题目往往可以简单的对拍,不需要花多少时间。

然后把时间都花在略难题上,争取得到自己能得的最高分。

注意使用特判法,不能确保做法正确性的时候最稳妥的做法是特判。

暴力的范围然后暴力范围用暴力。


3.8.2 比赛方法 2 :困难题


特点:题目有一定难度,无法全部做出。

易犯错误:考场看都没看,放过了本来应该是非常简单的题目。

在这种比赛中,正确的做题顺序非常重要,但是做题顺序来源于对题目的了解,

而对题目的了解又需要花费你的时间,这两个方面各自牵制,并非独立。

我个人的做法是首先要抽出半小时看完所有题目并且随便想一想,然后对每题都

可以标出使用你第一眼想到的做法。

然后再每题花 10 分钟略微细致的分析加想一下。


基本上不难的题目都可以做出,就算做不出也会有“这题不是很难”的感觉,并且标上目前这题你能得出来的概率。


那么根据之前对题目的了解,就可以决定做题的顺序了。


相关文章
|
11天前
|
存储 算法 程序员
C 语言递归算法:以简洁代码驾驭复杂逻辑
C语言递归算法简介:通过简洁的代码实现复杂的逻辑处理,递归函数自我调用解决分层问题,高效而优雅。适用于树形结构遍历、数学计算等领域。
|
12天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
36 1
|
20天前
|
存储 缓存 算法
通过优化算法和代码结构来提升易语言程序的执行效率
通过优化算法和代码结构来提升易语言程序的执行效率
|
27天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
1月前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
41 3
|
1月前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
2月前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
2月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
277 65
|
2月前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
22 0