C++算法笔记
JeffyGao
吃完饭再说 0.0
展开
-
蓝桥杯-(精度问题)猴子吃包子—算法笔记
想法:本题难点在解决精度问题(由变量p决定)。利用 #include 库即可:cout << setiosflags(ios::fixed) << setprecision§; //保留p位有效数字然后在下面 cout 输出即可。数据规模和约定 0<x<100;0<y<100;0<z<100;0<x1<=...原创 2020-04-14 23:41:32 · 299 阅读 · 0 评论 -
蓝桥杯-(利用multiset容器)解哈夫曼树-算法笔记
**哈夫曼树主要步骤:**1-排序 可以直接放在 <set> 的 multiset中,会自动排序且允许重复项2-把最小的两个数加起来,且把和值放到累加器中 可以创建一个全局变量存3-把两个最小的数加起来的和,放到容器中 注意:关联容器中的迭代器不能 p+n, 只能p++。(最好是写 ++p)#include <iostream>#include <se...原创 2020-04-14 23:38:42 · 147 阅读 · 0 评论 -
蓝桥杯-2n皇后问题——算法笔记
“2n皇后”问题本质上还是 用 dfs 写“8皇后”问题。先确定黑皇后的排列,再确定白皇后的排列。此代码特色:1)用一维数组posb[maxn]、posw[maxn]即可表示黑白皇后的摆放。eg. posb[2]=1 表示黑皇后在第二行第一列放一枚。2)if( posw[i] == posw[cur] || abs(i-cur) == abs(posw[i]-posw[cur]))这...原创 2020-04-14 23:32:46 · 331 阅读 · 0 评论 -
(贪心)一维数组解完全背包问题(物品只能选有限次)——算法笔记
有n件物品和容量为m的背包 给出i件物品的重量以及价值 还有数量 求解让装入背包的物品。重量不超过背包容量 且价值最大 特点它与完全背包有类似点 特点是每个物品都有了一定的数量#include<iostream> using namespace std;int w[100],v[100],c[100];int f[100];int main(){ int...原创 2020-03-28 21:13:59 · 268 阅读 · 0 评论 -
(贪心)一维数组解完全背包问题(物品可无限重复选)——算法笔记
题目: 有n件物品和容量为m的背包 给出i件物品的重量以及价值 求解让装入背包的物品重量不超过背包容量 且价值最大 区别:完全背包问题可以重复选择! 相对于二维数组的解法节省了空间,每一次循环都会刷新f[] #include<iostream>using namespace std;int w[500],v[500];int f[500];int main(...原创 2020-03-28 21:11:38 · 950 阅读 · 0 评论 -
(贪心)一维数组解背包问题(物品只能拿一次)——算法笔记
题目: 有n件物品和容量为m的背包 给出i件物品的重量以及价值 求解让装入背包的物品重量不超过背包容量 且价值最大 相对于二维数组的解法节省了空间,每一次循环都会刷新f[]#include<iostream>using namespace std;int w[500],v[500]; int f[500]; //f[i]表示容量为 i 时的最大权值 int m...原创 2020-03-28 21:10:22 · 321 阅读 · 0 评论 -
(贪心)二维数组解背包问题(物品只能拿一次)——算法笔记
题目: 有n件物品和容量为m的背包 给出i件物品的重量以及价值 求解让装入背包的物品重量不超过背包容量 且价值最大。 该方法通过用 f[][]来表示所有 num-weight 的关系矩阵.进而得出当 数量为 n 时的最大 weight #include<iostream>using namespace std; int w[500],v[500]; ...原创 2020-03-28 21:09:31 · 457 阅读 · 0 评论 -
(贪心)快速过河问题——算法笔记
首先对数组进行排序,速度快的在前面(过河速度取决于慢者)。 记速度最快的依次为 a,b,c,d...左侧是渡河的起点,left 表示左边剩余人数 由数学知: 当 2*b 不等于 a+c时需要判断 min(s1,s2)s1,s2表示把c d带走所需的秒数。 12出发,1返回;34出发,2返回;12过去 s1 = speed[1] + speed[0] + speed[left-1]+...原创 2020-03-28 21:05:57 · 796 阅读 · 0 评论 -
(贪心)硬币问题——算法笔记
尽量使用大面值硬币。因为不用大面值,将使用更多小面值硬币,一定得不到最优解。#include <iostream>using namespace std;int cnts[6]; //放相应的硬币数 int coins[6]={1,5,10,50,100,500}; //硬币种类 int num[6]; //表示对应的硬币用了多少个 int res; //所需最少...原创 2020-03-28 21:02:56 · 400 阅读 · 0 评论 -
dfs练习-求全排列——算法笔记
输入 n ,求 1~n的全排列#include <iostream>using namespace std;int n;bool vis[20]; //参考, 1表示该点已选; 0表示未选 int a[20]; //记录每轮选的数 void pr(){ for(int i=1; i<=n; i++) { cout << a[i] <...原创 2020-03-26 22:10:45 · 277 阅读 · 0 评论 -
dfs解迷宫问题(带障碍物)——算法笔记
//用搜索来完成#include <iostream>using namespace std; int n,m,t; //n 行 m列 t个障碍物 int sx,sy,fx,fy; //起点坐标, 终点坐标 int cnt; //计数 bool map[100][100]; //放障碍物 bool vis[100][100]; //用于标记,访问过的节点不...原创 2020-03-26 22:09:10 · 1389 阅读 · 0 评论 -
dfs解成语接龙——算法笔记
#include <iostream>#include <string>using namespace std;int n,ans; //n:字符串数 ans:最大成语接龙 数string a[22]; //字符串最多22个int vis[22]; //记录每个字符串用的次数(最多两次)void dfs( string x, int s ) //x...原创 2020-03-26 22:07:24 · 637 阅读 · 0 评论 -
dfs困难的串——算法笔记
#include <iostream>using namespace std; int n,L,cnt=0;string s ="";bool check(char c) //判断在 s后面加 c能否构成困难的串 { int cnt1 = 1; for(int i = s.length()-1;i>=0;i-=2) //反复向前挪 { string...原创 2020-03-26 22:05:55 · 192 阅读 · 0 评论 -
dfs求素数环——算法笔记
输入正整数 n,对1~n进行排序,使得相邻两个数之和均为素数。输出时从整数1开始,逆时针排序,同一个环应恰好输出一次。记得回溯与剪枝。#include <iostream>#include <cmath> //sqrt(n)using namespace std;int a[100];bool isreal(int n) //判断数 n 是否是素数...原创 2020-03-26 22:05:09 · 207 阅读 · 0 评论 -
dfs八皇后问题——算法笔记
在一个 n*n 的棋盘上放置 n 个棋子 ,使得每行/每列/对角线上只能有1个旗子dfs 八皇后问题, 本质是递归问题要考虑四个因素:行、列、左斜、右斜#include <iostream>using namespace std;int n;int cnt; //计数器,有多少解 //判断是否占用 bool lie[20]; //列 bool u[40]; ...原创 2020-03-26 22:04:23 · 294 阅读 · 0 评论 -
dfs求水洼数——算法笔记
/*输入10 12W........WW..WWW.....WWW....WW...WW..........WW..........W....W......W...W.W.....WW.W.W.W.....W..W.W......W...W.......W.输出3*/#include <iostream>#include <string>...原创 2020-03-26 22:03:19 · 481 阅读 · 0 评论 -
dfs求部分和(用数组push,pop)做——算法笔记
每次用 push_back 和 pop_back 来控制选不选这个数 利用减法做,当k减到0了,就可以输出了 #include<bits/stdc++.h>using namespace std;int n;int k;int a[25];vector<int> temp;void dfs(int m,int sum) // m 数的位置 sum ...原创 2020-03-26 22:02:00 · 202 阅读 · 0 评论 -
部分和(迭代for循环)——算法笔记
#include <iostream>#include <cstring> using namespace std;void dfs(int *a,int *ex, int i, int n,int sum,int k) //判断第i位要不要,现在总数是sum { if(sum>k || i>n) //这里不能让 i>=n 因为如果需要最...原创 2020-03-26 22:00:35 · 225 阅读 · 0 评论 -
硬币表示值——算法笔记
暴力枚举法;#include <iostream>#include <string> #include <algorithm>using namespace std;void to1(int sum) // 法1--暴力枚举法 (倒着写会不会快一些?){ int result=0; for(int i=0; i<=sum/...原创 2020-03-26 21:59:22 · 170 阅读 · 0 评论 -
走方格——算法笔记
#include <iostream>#include <string> #include <algorithm>using namespace std;int result;void dfs(int bx, int by, int x, int y) //初始点坐标,终点坐标 {//边界 if( bx==x && b...原创 2020-03-26 21:58:21 · 751 阅读 · 0 评论 -
上楼梯——算法笔记
可以用用递归来写(从上自下/从下自上);从上至下时可以用公式:f(n)=f(n-1)+f(n-2)+f(n-3)。在计算的时候可以利用矩阵的乘法进行快速计算:乘以 [ 0 0 1;1 0 1;0 1 1]#include <iostream>#include <string> #include <algorithm>using namespace...原创 2020-03-26 21:57:15 · 234 阅读 · 0 评论 -
巧用dfs解数独问题——算法笔记
巧妙的用 n 表示 第n/9行第n%9列 (0是第一个数)。巧妙的用 row = (n/9)/33; col = n%9/33; 表示数独里面的小正方形(行、列)。那么遍历数独就至于要一个 n即可。 (0<=n < 81)因为数独答案唯一,所以只要找到一个正确的,就可以 exit(0); 了。#include <iostream>#include <cst...原创 2020-03-26 14:36:58 · 528 阅读 · 0 评论 -
快速幂运算——算法笔记
方法1:正常的幂运算 a^m 需要计算m次,快速幂运算利用了每次乘2进行翻倍大大减小了计算量。方法2:利用了二进制数的特性巧解幂运算,eg,10 -> 1010 至于要计算a^8 * a^2即可。 那么每次 m&1 即可判断此位需不需要乘,最后将 m>>1#include <iostream>using namespace std; long l...原创 2020-03-24 18:41:12 · 485 阅读 · 0 评论 -
用矩阵方法求斐波那契数列——算法笔记
用以用矩阵方法求斐波那契数列,求第n项值,只需要乘以 n-1次中转矩阵就行了参考:1 1 2 3 5 8 13 21 34 55#include <iostream>using namespace std;void mul(int (*A)[2]){ int size[2][2]={ {0,1},{1,1} }; //中转矩阵 int a,b,c,d; a = ...原创 2020-03-24 18:40:02 · 963 阅读 · 0 评论 -
Nim游戏——算法笔记
想法:所有小石头数换成二进制异或,只要大于0,则先手必胜#include <iostream>#include <string> #include <algorithm>using namespace std;int main(){//初始化 //int a[]={5,10,15}; //平局 //int a[] ={1,4,5}; ...原创 2020-03-24 18:38:48 · 292 阅读 · 0 评论 -
巧用进制解“天秤”问题——算法笔记
每个砝码只能用一次!思想:利用进制转换写,先把所给的数转换成3进制,再转换成字符串,逆转(这样从左到右就是位数从低到高,数值是1就不管,是2就往上进一位,并将此位记为-1,-1表示待会放在左边砝码;是3就往上进一位,并将此位记为0) #include <iostream>#include <string> #include <algorithm>...原创 2020-03-24 18:37:48 · 367 阅读 · 0 评论 -
用滚动哈希算法(RabinKarp)求字符串匹配——算法笔记
简化了用哈希算法(RabinKarp)求字符串匹配的复杂度。复杂度 o(m+n)。除了开始有一个hash(o(n)),后面就开始滚动算(一次扫描)。用滚动的方法求出S中长度为p.size()的字串hash值 。#include <iostream>#include <string> #include <cmath> //pow()using n...原创 2020-03-23 17:05:14 · 504 阅读 · 0 评论 -
用哈希算法求字符串匹配——算法笔记
复杂度 m*n它的思想类似于进制数转换,把目标数组看成一个ASCII数,然后求其hash值。#include <iostream>#include <string> using namespace std;long hash(string str) //求字符串的一个hash值 { int seed = 31; long hash=0; for(in...原创 2020-03-23 17:03:29 · 388 阅读 · 0 评论 -
判断字符串是否是回文串——算法笔记
#include <iostream>#include <string>#include <algorithm> //reverse()using namespace std;int main(){ //string aa = "abcba"; //string aa = " "; int len=aa.size(); string bb...原创 2020-03-22 23:34:51 · 308 阅读 · 0 评论 -
去掉连续出现的k次0——算法笔记
如果所给的是数字(不是字符串),可以先准换成字符串#include <iostream>#include <vector>#include <string>using namespace std;int main(){ //string aa = "abd000asw000abc00"; string aa; getline(cin,aa...原创 2020-03-22 23:34:20 · 178 阅读 · 0 评论 -
将字符串按单词翻转——算法笔记
eg. here you are -> are you here#include <iostream>#include <string>#include <vector> //刚好是以空格为分隔的 using namespace std;int main(){ string aa = "here you are"; //strin...原创 2020-03-22 23:33:33 · 155 阅读 · 0 评论 -
是否为旋转后的字符串——算法笔记
要判断 b 是否是 a的旋转词,只需要判断 字符串 b+b中是否包含 a 即可#include <iostream>#include <string>using namespace std;int main(){ string s1="AABCD"; //string s2="CDAA"; string s2="CDAeA"; string s3...原创 2020-03-22 23:32:41 · 88 阅读 · 0 评论 -
字符串的压缩——算法笔记
#include <iostream>#include <string>using namespace std;int main(){ string aa="aabcccccaaab" ; int len=aa.size(); char p = aa[0]; int num=1; for(int i=1; i<len; i++) { ...原创 2020-03-22 23:31:45 · 176 阅读 · 1 评论 -
替换字符串中的空格——算法笔记
空格的 ASCII码是 32函数 replace()不是很好用。(没有JAVA中的 replaceAll()好用)#include <iostream>#include <string>using namespace std;int main(){ //string aa="Mr John Smith"; string aa="Hello World...原创 2020-03-22 23:28:23 · 118 阅读 · 0 评论 -
判断两字符串中字符元素是不是一样(可以不同顺序)——算法笔记
#include <iostream>#include <algorithm>#include <string>using namespace std;int main(){ string aa="aBCDEFGHIJKLMNOPQRST1234567891"; string bb="aBCDEFGHIJKLMNOPQRST12345678...原创 2020-03-22 23:27:35 · 978 阅读 · 0 评论 -
Z形打印矩阵值——算法笔记
#include <iostream>using namespace std;int main(){//初始化 int n,m; cin >> n >> m; int a[n][m],num=n*m; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { cin ...原创 2020-03-20 17:53:52 · 141 阅读 · 0 评论 -
子矩阵最大累加和——算法笔记
假定只有一行,那就和求最大和子数组一样如果限定两行,可以把两行按列求和,同上所以我们以第一行当做起点,依次累加后面的每一行后,都求一个最大子数组和以第二行作为起点,依次累加后面的每一行后,都求一个最大子数组和每次求出来的和与历史最大值比较,如果更大,则更新N^3时间复杂度#include <iostream>#include <cstring>using...原创 2020-03-20 17:52:55 · 274 阅读 · 0 评论 -
返回子数组最大累加和——算法笔记
#include <iostream>using namespace std;int findByDp(int *arr,int len) //用递推写 { int sumj = arr[0]; int max = sumj; int left=0, right=0; for(int j=1; j<len; j++) { if(sumj>=0...原创 2020-03-20 17:51:16 · 210 阅读 · 0 评论 -
求边界为1的最大子方阵——算法笔记
//法1: 枚举 #include <iostream>#include <algorithm> //max()using namespace std;int ans=1;int judge(int (*a)[5], int i, int j,int n) //矩阵a,当前点坐标为(i,j),要判断的边长为n { //左上角坐标 (i,j),右下角坐...原创 2020-03-20 17:49:52 · 200 阅读 · 0 评论 -
将矩阵中“0”元素所在的行、列清零——算法笔记
样例:1 2 3 45 6 0 89 0 11 1213 14 15 16#include <iostream>#include <cstring> //memset();using namespace std;int main(){//初始化 int n,m; cin >> n >> m; int a[n][m];...原创 2020-03-20 17:47:11 · 320 阅读 · 0 评论