程序设计竞赛学习总结

本文是一位大学生分享自己的程序设计竞赛经历,从自学参赛到获奖的心得。作者强调初期不应过早追求高级算法,而应扎实基础,如模拟、二分查找、贪心等。文中列举了 ACM、IOI 和 OI 三种赛制,并指出在比赛中模拟题目的重要性。作者总结了自己的常用算法,包括模拟、搜索与剪枝、图论和字符串处理等,并建议新手先掌握基础再逐步深入。
摘要由CSDN通过智能技术生成

前言

我从大一就开始接触程序设计竞赛,一直比到大四,眼看着即将毕业,今后应该也和这没什么交集了,所以写下这篇文章做做总结,不知道能给大家带来多大帮助。
因为在这之前我们学院并没有专门的集训队,也更没老师教我,所以我学的知识基本都是自学的(外加学长学姐的提点),所以我所做的总结没有那么系统;另外其实我本身掌握的知识就很少,参加的比赛都是很低的level,赛场上更多的也是靠更快的做出签到题拿奖(而不是靠题数),因此可能干货很少(求大佬不要笑话),是否有用还请各位酌情比较。
在这里我也简单列举一下我参加并获奖的比赛,在各位大佬面前应该只是入门级水平,写在这里方便各位参考决断自己要不要往下读。

  • 内蒙古自治区大学生程序设计竞赛
  • 东北地区大学生程序设计竞赛
  • 蓝桥杯C++/C大学A组
  • 团体程序设计天梯赛

看到这些是不是感到心灰意冷,发现这个作者菜得离谱还写文章。要是胆子大不怕被我带歪的往下看吧。

赛制

我自认为,既然打算打比赛,首先我们要先把赛制搞明白,据我了解,目前主流的总共有三种赛制

赛制介绍
ACM每次提交都会立即返回结果(正确、答案错误、段错误。。。),如果提交错误会有罚时(我记得是20min),排名优先按照通过题目的数量,如果题数相同则按照耗时从小到大排名。
CCPC、ICPC等三人一组的团队赛基本都是这总赛制
IOI每次提交都会立即返回结果,可以过测试点的分(即不通过也可能拿到一定的分数),按照总分排名。
我只知道天梯赛是这种赛制,还请大佬继续补充
OI以最后一次提交为准,比赛结束后才进行判题,可以过测试点的分,按照总分排名
蓝桥杯采用此赛制

比赛经验

至少在我的角度上看,我认为这里应该是读到这的你认真思考的。
很多人,包括我自己刚开始也是,认为尽快的学习高级一点的算法很重要,但至少我这三年的经历告诉我,这恰恰是错的。
至少我接触的有很多人,在一些较复杂的模拟(但恰恰是很多比赛拉开差距的关键)题还做的有问题的基础上,都开始看诸如动态规划、数论等较难的知识,因为毕竟我的level有限并没有过多的提醒他们,但既然写总结了,我还是想谈谈我的看法。
其实在我刚开始的时候,我也是看了很多算法,然后其实到了比赛场上完全没用上,甚至还耽误了我的时间。因为你学会一个算法,能打板子题和能够上场比赛之前差的是很多的,需要很大量的训练,可能需要照着这个算法做几十到上百题,而这个前提就是你基础得打好,因为复杂的算法应用到题目上,需要很强的实现能力(比如快速实现复杂模拟的能力),并且很多时候,一道题在考察一个复杂算法的同时,还会牵扯很多简单的知识点。
其实想想挺讽刺的,在我这三年的比赛里,我学的高级一点的算法没有一次用得上,因为这些算法应用到题目上需要根据题目进行算法的简单改造,而很显然我没有那个能力,所以我获得的奖,所牵扯到的无非只有:

  • 模拟
  • 二分查找
  • 字符串处理
  • 基本的搜索与剪枝
  • 基础的贪心
  • 图论(并查集)
  • 脑筋急转弯等找规律题

而我所写过的最复杂的,就是记忆化搜索了(我很多高一点的奖项,这个算法是关键),至于像背包、树状数组、线段树等我看的知识完全没用上。。。如果你目前只是想到我这个level,你就可以抛弃那些高级算法了。

所以后来我的比赛思路就是以最快的速度写完简单题,而我做的训练就是不停的做同level题,效果很明显。当然我也承认,这种方法很难有更大的突破,所以我认为至少刚开始,你最好抛弃那些高级算法,等到你的成绩、能力有所稳定(能够保证所学的知识的题大概率能做上来的时候,再去看进一步的算法)。

算法

应该很多人想看这部分吧,在这里,我简单总结了我总共了解过哪些算法,如果你能完全掌握我说的这些知识(不是会默写板子,是真的不看题解能a题),那你应该能得到比我高的奖,在那之后,就请你再找大佬的总结吧,我的水平已经跟不上你了。

模拟

我单独说一下模拟,是不希望你小瞧他,赛场上,很多时候,你可能做出来的题目和其他人一样,这时候就得比时间,越早做出来模拟,你就更大可能的得奖。而OI和IOI赛制,你如果不够熟练,你的模拟很可能拿不满,这种小分的差距最致命了。

二分查找

贪心

搜索与剪枝

  • 深度优先搜索(dfs)、记忆化搜索
  • 广度优先搜索(bfs)

图论

  • 最短路径
  • 最小生成树
  • 并查集、种类并查集
  • 欧拉图

字符串

  • KMP算法
  • 最长上升子序列(复杂度分别为n^2,nlogn两种方法)
  • 最长公共子序列
  • 最长公共上升子序列(我记得是叫这,实际我没学会,只是了解)
  • 后缀数组(我感觉挺难的,至少我没学会)

  • 树状数组
  • 线段树(有一定难度)
  • 主席树(可持久化线段树)(我感觉很难,只会打板子)

动态规划

  • 背包问题
  • 状压DP
  • 树形DP

数论

  • 素数筛

先写到这吧,如果有想起来的我还会更新,今后如果有时间我可能会写一下简单算法的教程,如果我写了会把链接附到这篇文章。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值