每个伟大的梦想,都有一个微不足道的开始。

程序的设计目标和流程

设计一个程序是为了让计算机始终不渝地遵循指令,以完成特定的任务。为
了能让计算机听懂指令,我们编写程序来与计算机交流。

编程方法

  1. 使用IDE(集成编辑环境)例如:Dev C++ / CodeBlocks。
  2. 使用洛谷在线编程 https://www.luogu.com.cn/ide

什么是编程

程序 就是为实现特定目标或解决特定问题而用计算机语言编写的一系列令序列。

计算机语言 是人与计算机之间通信的语言。

编程 是程序员为解决特定问题,按照自己的思路,在遵循特定的计算机语言规则下编写程序的过程。

C++ 语言

以 C++ 语言规则为例来学习编程。

  • 直接原因: 信息学竞赛只允许使用 C++。
  • 其他原因: 比较底层,运行速度快。

C++ 是编译语言,需要编译成可执行文件。


例1. 你好洛谷

编写一个程序,让计算机告诉大家我爱洛谷,即I love Luogu!

代码如下:

输入输出自行百度。

解决算法问题的步骤

变量

用于存放数据的容器。

有不同的类型——整数、浮点数、字符,等等。变量的值可以变化。

可以当做表达式的一部分参与计算。

定义

1
2
3
4
5
6
7
8
#include <bits/stdc++.h>
using namespace std;

int main()
{
数据类型 变量名;
return 0;
}

常见类型

类型名 作用
int 整型,如 int a = 1;
float & double 浮点,一个单精度,一个双精度。如 double a = 3.1415926
bool 布尔,只有 01,代表真和。如 bool flag = 0; //或者 bool flag = false;
char 字符型,内存放字符,定义或访问时要用单引号包着,如 char a = 'A';

变量的名称

  1. 只能由英文字母、数字和下划线(_) 组成。
  2. 不能以数字开头。
  3. 不能和其他“关键字”重复。关键字(又称保留字)有很多,比如 if , int
  4. 要区分大小写,如 $Ans$ 和 $anS$ 是两个完全不同的变量。

数学

C++ 还可以运算数学,(常用的)具体如下:
| 数学符号 | C++ 运算符号 |
| :—————: | :—————: |
| $+$ | $+$ |
| $-$ | $-$ |
| $\times$ | $*$ |
| $\div$ | $/$ |

还有一些二进制运算符后面会学到。

实例:

1
2
3
4
5
6
7
8
#include <bits/stdc++.h>
using namespace std;

int main()
{
cout << 114 * 514 / 114514 + 114514 << endl;
return 0;
}

一些注意的点

  1. 不能除 0。
  2. 浮点运算必须带有至少一个浮点数,不然默认整型,会产生精度误差

学以致用

超级玛丽游戏

超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
                ********
************
####....#.
#..###.....##....
###.......###### ### ###
........... #...# #...#
##*####### #.#.# #.#.#
####*******###### #.#.# #.#.#
...#***.****.*###.... #...# #...#
....**********##..... ### ###
....**** *****....
#### ####
###### ######
##############################################################
#...#......#.##...#......#.##...#......#.##------------------#
###########################################------------------#
#..#....#....##..#....#....##..#....#....#####################
########################################## #----------#
#.....#......##.....#......##.....#......# #----------#
########################################## #----------#
#.#..#....#..##.#..#....#..##.#..#....#..# #----------#
########################################## ############

分析

多行输出即可,注意加上换行 endl\n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<bits/stdc++.h>
using namespace std;

int main()
{
cout<<" ********\n";
cout<<" ************\n";
cout<<" ####....#.\n";
cout<<" #..###.....##....\n";
cout<<" ###.......###### ### ###\n";
cout<<" ........... #...# #...#\n";
cout<<" ##*####### #.#.# #.#.#\n";
cout<<" ####*******###### #.#.# #.#.#\n";
cout<<" ...#***.****.*###.... #...# #...#\n";
cout<<" ....**********##..... ### ###\n";
cout<<" ....**** *****....\n";
cout<<" #### ####\n";
cout<<" ###### ######\n";
cout<<"##############################################################\n";
cout<<"#...#......#.##...#......#.##...#......#.##------------------#\n";
cout<<"###########################################------------------#\n";
cout<<"#..#....#....##..#....#....##..#....#....#####################\n";
cout<<"########################################## #----------#\n";
cout<<"#.....#......##.....#......##.....#......# #----------#\n";
cout<<"########################################## #----------#\n";
cout<<"#.#..#....#..##.#..#....#..##.#..#....#..# #----------#\n";
cout<<"########################################## ############\n";
return 0;
}

另外一些事情

  1. 推荐算法平台:洛谷。

洛谷创办于2013年,致力于为参加noip、noi、acm的选手提供清爽、快捷的编程体验。它拥有在线测题系统、强大的社区、在线学习功能。很多教程内容由各位oiers提供的,内容广泛。

  1. Debug

先可以尝试模拟代码,找到错误;实在不行可以在洛谷发帖求助。

  1. 推荐的书

覆盖算法竞赛语言、基础算法,打好坚实基础

本书从介绍 C++ 语言开始,各个击破程序设计竞赛中的基础考点,包括各种基础算法、数据结构和数学知识。

这些都是重中之重,如果没有掌握这些知识,继续深入的学习就如同试图建设空中楼阁。这些知识对读者的数学水平要求不高,有初中的数学基础即可阅读。

深入浅出,解答“是什么、为什么、怎么办”的问题

正如本书的书名一样,本书力求使用浅显易懂的语言讲述各种深刻的算法思想,因此读起来生动有趣,而不是面对冰冷的数学符号和代码。

每个专题中都会以精心选择的例题为主线,先介绍这个知识点是用来干什么的;然后花费大量的篇幅,图文并茂地介绍各个知识点的详细过程和代码实现方法;最后结合题目,介绍了如何将算法应用到实战中。有些例题甚至介绍了多种不同做法,帮助读者拓展思维,举一反三。

适用人群:备战 NOIP、ICPC 等算法竞赛的初阶选手

本书的多数例题都配备代码风格良好的示例代码,可以帮助读者更好地学习算法如何使用代码实现。在讲解的过程中给出了大量的算法竞赛中需要注意的琐碎问题,这些都是前人的经验之谈,希望读者可以少走弯路。

近 400 道例题和习题,可以在线提交评测。

本书有约 400 道例题和习题。为了节约阅读时间和篇幅,例题和习题都只保留了题意简述。大部分的题目都可以在洛谷中找到并提交代码评测,还可在洛谷阅读其他同学提供的题解并进行讨论。

题目选材范围多样,覆盖了应当学习了解的知识点。如果读者能够完全掌握这些题目,相信可以有相当程度的进步。

可以先尝试适读,链接


洛谷试炼场(用于练习熟练度)

新手村

任何一个伟大的目标,都有一个微不足道的开始。

洛谷入门

勇敢的迈出第一步,了解下语言和洛谷。跟着书本和老师走,不会难的。

顺序与分支

计算机的智能性开始得以体现,因为计算机能够根据不同的条件选择了。

循环!循环!循环!

计算机最不怕的就是重复。你让它做10000次同样的事它也不怕啦,但是让他做1亿亿次的话……

数组

跟数组有关的题目基本上都要用到循环,所以请先完成前面几部分。

简单字符串

计算机不仅可以处理数字,还能处理文字!就是其实跟数字也没什么差。

过程函数与递归

将代码串进行打包,就是过程与函数。过程与函数调用自己则为递归。有一点小难但不要怕哦。

BOSS战-入门综合练习1

这里将前面的内容综合起来了,会有点难,不过你可以问老师同学,也能上网查资料。

BOSS战-入门综合练习2

勇士,竟然来到了BOSS的老巢!来一场恶斗,证明自己的实力,解锁下一个级别!

普及练习场

普及组选手可冲刺训练,提高组选手亦可在此巩固基础。

简单的模拟

开始普及组的训练!所谓模拟,就是直接根据题意编写,思维难度简单。

交叉模拟

这里也是模拟,但是会混有些别的部分。思维难度不大,但是编写起来会有些难度。

排序

将杂乱无章的数据变得有规律。有各种各样的排序算法,看情况使用。

排序Ex

这里的排序就更上一层了。不仅融合了别的算法与技巧,排序本身也有各种花招。

字符串处理

这里的字符串处理还会变得更加的有意思,难度也更大。需要好好地思考一下。

贪心

贪心就是只考虑眼前的利益。对于我们人生来说太贪是不好的,不过oi中,有时是对的。

深度优先搜索

搜索可以穷举各种情况。很多题目都可以用搜索完成。就算不能,搜索也是骗分神器。

广度优先搜索

广度优先搜索可以用来找有关“最短步数”的问题。嗯,也可以用来“地毯式搜索”。

带有技巧的搜索

这里的搜索不仅包含了dfs和bfs,还包括剪枝、记录等技巧以加快速度。

分治算法

将大问题拆分为小问题,分而治之,各个击破,然后在合并回来。

简单数学问题

用计算机解决某些麻烦数学问题,再合适不过了。这真是绝妙的搭配啊!

递推与递归二分

递推,层层递进,由基础推向顶层。二分不仅可以用来查找数据,还可以确定最合适的值。

线性数据结构

数组,链表,队列,栈,都是线性结构。巧用这些结构可以做出不少方便的事情。

树形数据结构

由一个根节点分叉,越分越多,就成了树。树可以表示数据之间的从属关系

背包问题

这是最基础的动态规划。不过如果是第一次接触会有些难以理解。加油闯过这个坎。

线性动态规划

这也是基础的动态规划。是在线性结构上面的动态规划,一定要掌握。

多维动态规划

这里的动态规划就不止一维了。不仅要小心时间复杂度,也要注意空间复杂度。

动规与记忆化

这边的题目有各种搞法。当然有的题目也可以使用记忆化搜索来降低思维难度。

高精度算法

就算是long long(或int64)还不够怎么办?用高精度算法。自己动手丰衣足食。

贪心Pro

虽然是贪心题,可能不是你当时你虐着玩的贪心惹qwq

简单数论

数学和OI是密切相关的,数学不仅是OI的基础,而且是算法的核心。

BOSS战-普及综合练习1

好不容易闯到这一关,你那还等什么呢?抄起家伙赶快上啊!

BOSS战-普及综合练习2

来搞定第二个BOSS。虽然战斗艰难,但你一定没有问题。

BOSS战-普及综合练习3

普及练习场的大BOSS:“一定让你有去无回”。怎么办呢?只能打倒他开启下一个级别!

普及常见模板

这里集中了比较基础的算法的模板。提高和省选也有模板题哦!

提高历练地

已经去除普及组难度,请大家放心。成长大牛之必写题!!!

搜索Ex

开始提高组的试炼。这里已经去除了所有普及组难度的题目。哼哼,怕了吧?

动态规划LV_1

这是提高组难度中比较基础的动态规划,也许一两个转移方程就可以写出。

动态规划LV_2

这里的动态规划稍稍有所加大难度,思考转移方程的时间可能会与编写程序的时间持平。

动态规划LV_3

比较需要技巧的动态规划。有的不仅仅需要状态转移方程,可能还会与别的算法综合。

数论

数论就是研究整数的理论。包括公约公倍数、质数、欧拉定理和同余方程等。

博弈论

博弈论考虑游戏中的个体的预测行为和实际行为,并研究它们的优化策略。

其他数学问题

听说学OI的同志们数学都挺好。那么。就请完成下面的题目证明这一点吧!

图的遍历

图是一种非常重要的数据结构,描述对象复杂的练习。这里开始接触图的基本概念。

最短路问题

最短路是图论中最重要的部分,多种算法可以应用。很多题目都可以抽象成这种模型。

最小生成树

最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里姆)算法求出。

较复杂图论I

别的些图论问题,包括树、拓扑排序等。要过这一关,需要学习不少新的算法。

较复杂图论II

更高级的图论算法。包括差分约束、强连通、二分图等。会更难一些。

并查集

用于处理一些不相交集合的合并及查询问题。常常在使用中以森林来表示。

堆总是一棵完全树;堆中某个节点的值总是不大于或不小于其父节点的值。

线段树树状数组基础

这都是比较高级的线性数据结构。在处理一些询问与修改线性问题时,是很好用的。

神奇的解法

有些问题刚开始觉得无从下手。好好想一想,尽量别看题解,否则你会大呼“简单”。

倍增

一种特殊的枚举算法,但可大大加快效率。近年noip有考到。难度较大。

强连通分量

BOSS战-提高综合练习1

年轻人,又是个送上门的,让我来看看你真实的本领。啊哈哈哈哈哈!

BOSS战-提高综合练习2

再来!这里有的题目并非单纯的考察某个算法,而是考察一种综合性的思维。

BOSS战-提高综合练习3

既然已经打倒了前面2个boss,那么第3个也是没有问题的。少年,来吧!

提高模板-O(nlogn)数据结构

虽然这些算法不是NOIp必须的,但是不算困难,很多题目可以使用这些方法。

省选斗兽场/NOI神殿

为省选及以上选手制作的训练场。其实,省选水平的oier不需要一些外加的刷题列表,本栏仅供参考,也欢迎各位指出不足。

省选基础-读入/输出优化

读入/输出优化是省选刷题时必要的一个东西,这里给出了几题,需要自己手写相应的读入输出处理。作为第一关,这一关相对简单。

省选基础-位运算

位运算往往在必要的时候,能带你优化一下常数,也许是空间;也许是时间;有的时候这样可以多过很多分

省选基础-打表

打表虽然很赖皮,而且基本都是非正解,但是这种办法能让我们在省选中拿到一些会超时或者会超空间的一些数据点

动态规划1

动态规划

动态规划2

动态规划

网络流——最大流

最大流

网络流——费用流

费用流

单调队列

单调队列

概率期望

概率期望

二分图

二分图

点分治

点分治

后缀数组

后缀数组

主席树

主席树

数位DP

数位DP

AC自动机

AC自动机

平衡树

平衡树

树链剖分

树链剖分

动态树

动态树

树套树

树套树

可持久化Trie树

可持久化Trie树

莫队算法

莫队算法

分块

分块

莫比乌斯反演

莫比乌斯反演

其他

其他

USACO

美国经典的算法练习题库,值得一刷

USACO Section 1.1

USACO Section 1.2

完全枚举

USACO Section 1.3

贪心

USACO Section 1.4

有技巧的枚举

USACO Section 1.5

二进制数

USACO Section 2.1

图论和洪水填充

USACO Section 2.2

数据结构与动态规划

USACO Section 2.3

USACO Section 2.4

最短路径

USACO Section 3.1

最小生成树

USACO Section 3.2

背包问题

USACO Section 3.3

欧拉回路

USACO Section 3.4

计算几何

USACO Section 4.1

最优化

USACO Section 4.2

网络流

USACO Section 4.3

高精度

USACO Section 4.4

USACO Section 5.1

二维凸包

USACO Section 5.2

USACO Section 5.3

启发式搜索

USACO Section 5.4

USACO Section 5.5