小学期学的算法和做OJ题的各种经验总结

代码传送门

书上内容

  1. bfs、dfs搜索算法

  2. priority_queue 是堆
    (重写priority_queue的比较方法)

  3. 二叉搜索树、二分搜索(TODO)

  4. 集合set要点(是用二叉搜索树维护的容器)

  5. 字典map

  6. 并查集 disjoint set

  7. 判断是否有二分图

  • dfs,用vector<int> G[V] 存每个点的邻接点,对所有点dfs,每次dfs先染色该点,然后遍历当前点的所有邻接点,1.如果相同颜色则没有二分图return false 2.如果没有染色则return对该点能否dfs另一种颜色 3.全部遍历完则说明符合条件,return true
  1. 带权图最短路径问题(Bellman-Ford、SPFA、Dijsktra; Floyd-Warshall)

  2. 最小生成树

  3. 差分约束

  4. 小顶堆/小根堆

  5. dp动态规划的本质是带记忆的dfs(记忆化搜索)

做题知识点

  1. RE:数组开太小了;读入的时候有问题;

  2. 数组的引用。用模板时传递的数组必须用常数初始化

template<int N>
void f(int (&a)[N]){
	...
}
int main(){
	int m = 2;
	int a[m] = {..};
	f(a) //×
	int a[2] = {..};
	f(a) //√

}
  1. 使用scanf和cin读取字符串的时候遇到空格会当作两部分分别读取,要想读取一行需要使用gets(char[])(以换行符结尾,前面记得加一次getchar()抵消掉一次换行读取)

  2. int是2^31-1,爆int的用long long

  3. 各种有用的函数

  • <algorithm>
    - sort(fisrt, last) 适合数组,vector
    - 可以写一个bool cmp()函数(默认小于比较)传递给sort(s,s+n,cmp), 或者重写小于号
    - min(a, b) max(a, b)
    - next_permutation(first, last)
  • <numeric>
    • accumulate(first, last, init) 有返回值
  • <climits>
    • INT_MAX (注意有加法操作时可能会爆int,最好设INF=999999999(9个9))
    • INF也可以设置成1<<30(1左移30位,230)或(1<<31) -1(INT_MAX)
  • <cmath>
    • ceil() floor()
int myints[] = {1,2,3};
do {
    std::cout << myints[0] << ' ' << myints[1] << ' ' << myints[2] << '\n';
} while ( std::next_permutation(myints,myints+3) );
  1. codeblocks必须要project才能debug

  2. 二维字符串矩阵读取

	s[n][m];
	for (int i = 0; i < n; i++) {
		scanf("%s", &s[i]);
	}
  1. struct也要写构造函数

  2. 数据范围
    假设时间限制为一秒

    时间复杂度(把n最大值代入)
    1e6游刃有余
    1e7勉勉强强
    1e8很悬

int:-231~231 ≈ 10^9…

  1. 多组数据数组初始化
    <cstring>
    memset(s, val, sizeof(s)) 填充char数组,对于int数组只能初始化为0或-1
    <algorithm>
    fill(s, s+n, val)可以初始化成任何数,适用于int数组、vector、char数组

  2. 数组越界!真的坑。移动点的时候检测目标点会不会越界

  3. 判断整数序列是否重复的时候可以构造出对应的整数,然后利用bool数组(开的足够大,利用seq= 1; seq= seq* 10 + digit构造整数)

if(isans[seq] == false){
	isans[seq] = true;
	ans++;
}

得到不重复的序列个数

  1. 重写priority_queue的比较方法:1
    (1)重写小于号
    (2)在建立的时候传递cmp对象
struct cmp{
	bool operator()( T &t1, T &t2)
    {
    	if(t1.x != t2.x)
        	return t1.x < t2.x -->按x降序
		return t1.y > t2.y   -->x相等时按y升序
	}
};
priority_queue<T, vector<T>, cmp>  que;
  1. 最大公约数
int gcd(int a, int b){
	if(b==0) return a;
	return gcd(b,a%b);
}
  1. 整数除法默认向下取整

  2. 可以连等赋值: a=b=1;


  1. ↩︎
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值