0.1 基本要求
算法比赛比较的是对某一个算法的熟练度,而不是尝试在考场上发明新思路。因此一定要刷够足够的题目,最好在300道以上。
0.2 基本流程
- 仔细阅读题目,从中抽象出模型,看出这道题是在考什么知识点。
- 回忆之前学过/练过的算法知识点,看有没有算法能解决这个问题。
- 注意所使用的算法是否会超时。
0.3 时间复杂度与超时的问题
一般C++语言1秒可以计算次,因此只要计算次数小于
,就不会超时。
按照如上规则,通过数据范围,可以倒推出题目对于时间复杂度的要求,然后倒推出题目可以使用的算法,y神总结如下:https://www.acwing.com/blog/content/32/。
例如,如果数据范围为,则一般要求时间复杂度为
,这样计算次数才不会超过
。
0.4 常用C++数据类型的范围
| 数据类型 | 范围 | | —- | —- | | int | -2147483648~2147483647(大约在正负210^9左右)(4字节存储) | | long | -2147483648~2147483647(大约在正负210^9左右)(4字节存储) | | long long | -9223372036854775808~9223372036854775807(超过10^18次方)(8字节存储) |
0.5 常用的头文件和函数
#include<iostream>
其中有cin和cout(用于数据规模小于)
#include<cstring>
其中有memset、memcpy
memset:memset
函数位于cstring
库中,功能为将数组中指定的连续元素统一置为某一个数,函数原型为memset(数组名,要改为的数字,修改的内存空间大小(一般用sizeof))
(二维数组仍然适用)
如将数组mp[2][2]
清零,代码如下:memset(mp, 0, sizeof(mp));
memcpy:memcpy
函数位于cstring
库中,功能为将一个数组中的内容复制到另一个数组中,函数原型为memcpy(接受复制的数组,被复制的数组,复制的内存空间大小(用sizeof))
(二维数组仍然适用)
如将a[2][2]
复制到b[2][2]
中,代码如下:memcpy(b,a,sizeof(b));
#include<cstdio>
其中有scanf和printf(比cin、cout速度快)(用于数据规模大于)
0.6 常用的技巧与小知识点
- 在main函数外声明的全局变量(包括数组)会被自动初始化为全0
- 使用位运算快速表示2的n次方:
**1<<n**
表示二进制数1向左移动n位,即表示