type
status
date
slug
summary
tags
category
icon
password
➡️
本文将介绍以下三方面内容:算法竞赛基本知识、如何自学与高效刷题、时间空间复杂度分析。

算法竞赛基本知识

OJ 评测结果

状态
全称
含义
可能的原因
AC
Accepted
程序通过
有问题吗?没有问题!
PC
Partially Correct
部分正确
输出的结果中有部分是错误的。某些评测系统会有这个评测状态。
PE
Presentation Error
格式错误
距离成功最近的一种,仅仅是输出答案的排版不正确,没有换行、插入了多余的空格等。
CE
Compile Error
编译错误
代码没有通过编译,可能是语法问题、链接错误、找不到头文件等。
WA
Wrong Answer
答案错误
答案与给定的不符,可能是计算错误、算法错误等输出了错误内容,或者有多余输出。
RE
Runtime Error
运行时错误
运行过程中出现的一些导致程序异常终止的问题,如段错误、除以 0、栈溢出等,属于程序本身的问题。
TLE
Time Limit Exceeded
超出时间限制
运行时间超出了题目规定的时间上限,可能是程序死循环或者算法复杂度过高。
MLE
Memory Limit Exceeded
超出内存限制
使用的内存超出了题目规定的上限,可能是空间复杂度过高。
OLE
Output Limit Exceeded
输出超过限制
答案输出过长,可能是出现了死循环,或者循环次数过多等问题。
UKE
Unknown Error
未知错误
系统因其它原因造成的错误。

三大赛制

  • OI 赛制:每道题提交之后都没有反馈,根据每道题通过的测试点的数量获得相应的分数。每道题不限制提交次数,如果提交错误没有任何惩罚,但仅以最后一次提交为准,赛后按照总得分来排名。
  • IOI 赛制:每道题提交之后都有反馈,可以实时看到自己每道题得了多少分,但看不到错误的测试样例。每道题都有多个测试点,根据通过的测试点的数量获得相应的分数。每道题不限制提交次数,如果提交错误没有任何惩罚。比赛过程中一般可以看到实时排名,按照总得分来排名。
  • ICPC 赛制:每道题提交之后都有反馈,但看不到错误的测试样例(LeetCode 周赛可以看到),每道题都有多个测试点,每道题必须通过了所有的测试点才算通过。每道题不限制提交次数,没通过的话会有罚时,比赛过程中可以看到实时排名,通过题数相同的情况下按照答题时间 + 罚时来排名。
OI 赛制和 IOI 赛制没有提交限制,提交错误也没有惩罚,所以可以大胆地提交,但 ICPC 赛制的罚时会拉开很大的差距。

比赛时间

每年时间不定,但大致相同。
上半学期:
  • 8 - 12 月:CCPC、ICPC
  • 12 月:蓝桥杯校赛
下半学期:
  • 4 月:蓝桥省赛、CCCC-GPLT 团体程序设计天梯赛国赛
  • 6 月:蓝桥杯国赛、RAICOM 睿抗省赛、四川省赛、百度之星省赛、码蹄杯省赛
  • 7 月:RAICOM 睿抗国赛、码蹄杯国赛
  • 8 月:百度之星国赛
以上为 B 类竞赛时间,赛氪上有一些比赛也可自行报名,加智育分(看学校)。

如何自学与高效刷题

学习语言

在算法竞赛中,C++ 是使用最为广泛的语言,它拥有以下优势:
  1. 有丰富的函数库。
  1. 可以使用 C++ 标准模板库(STL),极大地方便了操作。
  1. 格式化输入输出操作相对于其它语言比较方便。
  1. 极高的运行效率。
最重要的自然是第 4 条,更快更好始终是算法竞赛所追求的,C++ 完美地满足了这点要求。

学习算法

语言只是工具,算法才是灵魂。
在完成语言部分后,我们便可以来好好研究程序的灵魂了。
算法小科普:
对于有看书习惯的同学,推荐以下书籍:
  • 《挑战程序设计竞赛 第 2 版》
作者巫泽俊,是 ACM-ICPC 世界总决赛冠军。
  • 《算法竞赛入门经典 第 2 版》
竞赛选手常称为紫书。
这两本书均可作为算法竞赛的入门书籍,可以从中较为全面地学习基础算法。
  • 《算法竞赛》
俗称白书,比较新的算法竞赛指南。
 
从这一阶段开始,学新算法 → 刷题 → 遇到不会的题 → 学新算法将会是一个常态化的过程,算法竞赛选手需要在这一过程中具有较强的定力、坚持下去的决心以不断锤炼自己的编码水平与算法水平。
在这一过程中,各大 OJ 平台将会是训练的重点。

常用网站/OJ

PTA(Pintia)

PTA 是学校很多课程所用的教学平台,同时,它的公共题目集也很适合作为入门期训练所用,也是备战天梯赛的主要平台。
在入门期,可以通过刷固定题目集-团体程序设计天梯赛-练习集 L1 部分进行基础语法的学习与巩固。

洛谷(Luogu)

洛谷是备战 NOIP/NOI 的重要平台,也是中国目前最庞大的算法竞赛备赛平台。网站内存在大量 NOIP/NOI 真题,题库丰富且大多具有题解,具有比较高的训练价值。
同时,洛谷也收录了 Codeforces、AtCoder、SPJ 等 OJ 的题目。

牛客竞赛

牛客网主要提供技术类求职备考、社群交流、企业招聘等服务。而牛客竞赛则主要针对 OI 与 ICPC 选手进行竞赛训练。牛客 OJ 中具有比较丰富的题库,也有定期举办的牛客系列比赛作为训练内容。
牛客作为线上办赛平台,可在平台上参加各大高校的程序设计校赛/新生赛作为算法初学阶段的练习。

AcWing

由闫学灿(北京大学、NOI 金牌)自建的一个课程网站,其中的算法课(算法基础课、算法提高课)需要付费购买,性价比在同行中颇高。
授课方式以题目打卡、视频回放的方式进行知识点讲解。知识点的整理分类对于初入算竞的小白来说尤为关键。
网上自然有许多免费课程,但缺少系统化整理,买课观看不失为一种有效方式。

LeetCode(力扣)

LeetCode 是国外面向面试、笔试的算法学习平台,力扣是其国内版。与传统 OJ 相比,LeetCode 写题均为核心代码模式(函数题),无需自己处理输入输出。
但是,对于准备算法竞赛来说,LeetCode 并不适合作为训练平台,其题目风格与题目难度均与真正的竞赛环境相去甚远。
而对于找工作而言,LeetCode 的题目较为适中,适合在大四春招期间作为练习平台。

Codeforces

到达一定水平后,Codeforces 的训练便必不可少。Codeforces 是全世界最强最大的算法平台,是由俄罗斯萨拉托夫国立大学的一个团体创立并负责运营的。它最大的特点就是代码和题解的公开,所有人都可以随意查看其它大牛的代码,且具有质量极高的题库。
Codeforces 会不定期开展比赛,难度分为 div1~4 四个阶段,其中 div1 最难,div4 最易,具有很高的训练价值。
Cf 介绍与使用:

AtCoder

AtCoder 是日本最大的算法竞技网站,也是全球第二大的算法竞赛平台,正式创立于 2012 年 6 月 20 日,由 AtCoder Inc. 运行并维护。与 Codeforces 相似,AtCoder 也会不定期展开相关比赛,分为 ABC、ARC、AGC 三个难度逐级递增,AtCoder 题以思维难度高而著名,大多数 ARC、AGC 难题都没用到什么高级算法,代码量也不大,但非常难以想到。
AtC 介绍与使用:

Virtual Judge

Virtual Judge 是一个不是 OJ 的 OJ。
它主要通过爬虫软件,爬取其它 OJ 的题目,让我们可以直接在 VJ 上查找并提交各种 OJ 的题目,然后将我们的题目通过它的账号(比如你在 Cf 上会看到用户名 vj1、vj2……在 HDU 上会看到张翼德、马孟起……)在真正的 OJ 上提交并把结果反馈给我们,相当于一个平台一个中介。
包括上述所说的 Codeforces、AtCoder、洛谷等平台,VJ 均可爬取并进行提交。

HydroOJ

HydroOJ 是一个新兴的在线评测系统,目前尚处于发展阶段,正在维护 BZOJ 题库、CCF 真题题库及英文翻译。
RemoteJudge(远端评测)已支持:洛谷、Codeforces、SPOJ、POJ、UOJ,并仍在不断增加对更多 OJ 平台的支持。
可以自由引用官方的公开题目(包括 RemoteJudge 题库)创建比赛、作业和训练计划。

Cpp reference

cppreference 是一个 C/C++ 在线参考手册。
在语法学习阶段,可以通过查阅该网站了解 C/C++ 语法,学会使用 C/C++ 标准库。

OI Wiki

OI Wiki 是一个免费开放且持续更新的编程竞赛(Competitive Programming)知识整合站点。大家可以在这里获取与竞赛相关的、有趣又实用的知识。
该网站具有种类齐全的算法分类与讲解,遇到不会的算法基本均可以在此网站找到。

算法复杂度分析

为何要分析

计算机执行代码并做基本运算是需要时间的,开数组和变量名是需要占用空间的。在处理一个问题时,题目会限制时间与空间。你的代码需要在限制时间内输出结果,并且在空间限制内存储数据。
通常情况下:
时间限制:C/C++ 秒,其它语言
空间限制:C/C++ ,其它语言

时间复杂度

概念:衡量一个算法的快慢,一定要考虑数据规模的大小。所谓数据规模,一般指输入的数字个数、输入中给出的图的点数与边数等等。一般来说,数据规模越大,算法的用时就越长。而在算法竞赛中,我们衡量一个算法的效率时,最重要的不是看它在某个数据规模下的用时,而是看它的用时随数据规模而增长的趋势,即时间复杂度。
计算机的运行速度大约是 次(级别)/秒,Cf 的评测机能达到 次/秒。
一般我们使用大 符号粗略表达时间复杂度:

常数阶

程序中不包含循环及递归。

线性阶

平方阶

对数阶

时退出,

线性对数阶

根号阶

复杂判断

以下算法的时间复杂度为
并列语句的执行趋势是相加的
嵌套语句的执行趋势是相乘的
如果将 改为 ,那么时间复杂度就是

复杂度排序

时间复杂度从小到大排序:
notion image
时间复杂度求的是运行的上界。解决一个问题时,我们需要考虑代码的最坏时间复杂度的情况是否超时。
秒之内大约能解决最大问题规模
运算量
最大规模
速度扩大两倍后
时间复杂度越小,能处理的数据就越大。这也是算法需要做的事情。

空间复杂度

概念:完成一个算法所需要占用的存储空间。
计算方法:
注意:二维数组 int a[x][y]; 所开大小为 ,总大小不能接近题目限制的内存。
 
相关文章
线上课 #17:栈与队列
Lazy loaded image
『社团英雄纪念碑』上线
Lazy loaded image
线上课 #12:选择排序与插入排序
Lazy loaded image
『林桛杨高』Demo 带你漫游杨高
Lazy loaded image
Git - 最优雅的分布式版本控制系统
Lazy loaded image
线上课 #11:算法复杂度与排序算法入门
Lazy loaded image
线上课 #10:结构体指针与链表结构人有所操
Loading...
DrimTech
DrimTech
一群热爱信息技术,善于创造的羊羔
最新发布
线上课 #18:研究性学习开题仪式 & 如何科学地提问
2025-1-13
线上课 #17:栈与队列
2025-1-13
『林桛杨高』Demo 带你漫游杨高
2025-1-9
直面挑战,追求卓越——DrimTech 2024
2024-12-31
DrimTech 祝大家 1024 程序员节快乐
2024-12-31
邮箱添加别名教程
2024-12-29
公告
🎉 drim.cc 🎉
DrimTech 官方域名,它来了!