算法笔记
唐火
开始人工智能之路了!!!
展开
-
算法题目中常见的几种输入小点-gets,cin,scanf,getline,sstream
cin,scanf遇到空格都会停下来。gets可读入空格例如:在这里由于要读入空格,我们用gets来读入。const int N = 8;char g[N][N];while(gets(g[0])!=NULL){ gets(g[1]); }C++关于getline()和getchar()的小点C++ stringstream输入方式...原创 2021-04-12 09:03:20 · 181 阅读 · 0 评论 -
C++set容器去重法
给出一个10位数,它如果每个位的数都把0-9这10个数都只用了一次,就输出yes,否则输出no#include <iostream>#include <set>using namespace std;set<int>s;typedef long long LL;int main() { LL n; while (cin >> n) { s.clear(); while (n) { s.insert(n % 10); n =原创 2021-04-10 23:25:30 · 2290 阅读 · 0 评论 -
统计二进制数-dp
题目描述输入一个正整数m,请输出从0到m中每一个数字二进制数中含有1的个数的总和,由于数值较大结果需要模100000.输入格式一个m输出格式二进制数中含有1的个数的总和s输入输出样例输入2输出2输入5输出7说明/提示样例说明20%的数据 m<=50050%的数据 m<=100070%的数据 m<=50000000100%的数据 m<=100000000内存限制500MB解题思路:这种解法效率最高,有几个1就执行几次。把一个整数减去1,在原创 2021-03-15 00:03:59 · 2072 阅读 · 14 评论 -
哈希表-拉链法及应用举例
哈希表存储结构:1.开放寻址法2.拉链法哈希表的主要作用:把一个较大(0-10^9 )的数据映射到较小(0-N(N一般为10^5 到 10^6))的数据哈希函数:可以把一个从-10^19 到10^19 的中的一个数映射到0-10^5之间的一个数1.哈希函数怎么写?一般情况下,直接取模,x%10^52.把2个不一样的数映射成同一个数怎么办?我们可以用开放寻址法或者拉链法来解决这个问题首先我们先定义哈希函数:h(a) = b,指我们将a映射成b拉链法:开一个数组,举个例子:维护一个集原创 2021-02-26 19:02:34 · 1378 阅读 · 0 评论 -
快速排序
代码如下://author:Wecccccccc//time:2021.1.9#include <iostream>using namespace std;int partition(int a[], int low, int high) { int point = a[low]; while (low < high) { while (low < high && a[high] >= point) { high--;//a[high]原创 2021-01-09 12:33:57 · 79 阅读 · 0 评论 -
归并排序
归并排序:1.确定分界点 mid = (l+r)/22.递归排序 left,right3.归并——合二为一代码如下:#include <iostream>using namespace std;const int N = 100010;int a[N],w[N];int n;void merge_sort(int l,int r){ if (l >= r) return ; int mid = l+r>>1;原创 2021-02-21 17:46:46 · 87 阅读 · 0 评论 -
C++并查集的实现
编号代表每一个元素。数组par表示的是父亲的编号,也就是前驱。par[x] = x时,x是所在的树的根。代码如下:#include <iostream>using namespace std;const int N = 100010;int par[N], ranks[N];void init(int n) { //初始化n个元素 for (int i = 1; i <= n; i++) { par[i] = i; ranks[i] = 0; }}.原创 2021-03-27 18:26:36 · 124 阅读 · 0 评论 -
字符串哈希-BKDRHash
代码如下:#include <iostream>#include <vector>using namespace std;const int N = 10005;struct node { char name[35];};unsigned int BKDRHash(char *str) { unsigned int key = 0, seed = 31; while (*str) { key = key * seed + (*str++); } ret原创 2021-03-25 20:52:38 · 162 阅读 · 0 评论 -
素数-试除法和埃式筛选法模板
试除法:bool is_prime(int n){ if (n <= 1) return false; for (int i = 2;i*i<=n;i++)//这样写更好! if (n % i==0) return false; return true;}埃式筛选法:const int N = 1e7;int prime[N + 1];bool vis[N + 1];int n_prime(int n) { int k = 0; memset(vis, 0,原创 2021-03-24 15:36:48 · 154 阅读 · 0 评论 -
GCD、LCM模板
最大公约数GCD整数a和b的最大公约数记为gcd(a,b)。代码如下:int gcd(int a,int b){ return b == 0?a:gcd(b,a%b);}最小公约数LCM整数a和b的最小公倍数记为lcm(a,b)。代码如下:int lcm(int a,int b){ return a/gcd(a,b)*b;}...原创 2021-03-23 21:28:03 · 256 阅读 · 0 评论 -
快速幂(取模)模板
快速幂代码如下:int fastpow(int x,int n){ if (n==1) return x; int tmp = fastpow(x,n/2); if (n%2) { return tmp*tmp*x; } else return tmp*tmp;}位运算优化快速幂代码如下:int fastpow(int x, int n) { int res = 1; while (n) { if (n & 1) res *= x; x *= x;原创 2021-03-23 20:29:52 · 121 阅读 · 0 评论 -
最简单的并查集模板
代码如下:#include <iostream>using namespace std;const int N = 1010;int a[N];void init_set() { //初始化 for (int i = 1; i <= N; i++) a[i] = i;}int find_set(int x) { //查找 return x == a[x] ? x : find_set(a[x]);}void union_set(int x, int y) {原创 2021-03-22 16:07:41 · 81 阅读 · 0 评论 -
二分边界
转载地址:https://www.acwing.com/solution/content/33961/转载 2021-02-27 23:12:01 · 92 阅读 · 0 评论 -
整数二分
整数二分步骤:1.找一个区间[L,R],使答案一定在这个区间2.找一个判断条件,使得该判断条件具有二段性,并且答案一定是该二段性的分界点3.分析终点M在该判断条件下是否成立,如果成立,考虑答案在哪个区间,如果不成立,考虑答案在哪个区间4.如果更新方式写的是R = Mid,则不用做如何处理,如果更新方式写的是L = Mid,则需要在计算Mid时加上1核心操作:...原创 2021-02-23 15:06:08 · 105 阅读 · 0 评论 -
一维前缀和
代码如下:#include <iostream>using namespace std;const int N = 1010;int a[N], s[N];int main() { int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i];//原数组 s[i] = s[i - 1] + a[i]; } for (int i = 1; i <= n; i++) cou原创 2021-03-18 13:39:19 · 116 阅读 · 0 评论 -
一维差分
给定a[1],a[2],a[3],…,a[n]构造差分数组b[N],使得a[i] = b[1]+b[2]+b[3]+…+b[i]核心操作:将a[L]到a[R]中的每个数全部加上C原创 2021-02-22 21:18:42 · 123 阅读 · 0 评论 -
二维差分
给定原矩阵a[i,j],构造差分矩阵b[i,j],使得a[][]是b[][]的二维前缀和核心操作:给以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵中的所有数a[i][j]全部都加上Cb[x1,y1]+=C;b[x1,y2+1]-=C;b[x2+1,y1]-=C;b[x2+1,y2+1]+=C;例题:输入一个n行m列的整数矩阵,再输入q个操作,每个操作包含五个整数x1, y1, x2, y2, c,其中(x1, y1)和(x2, y2)表示一个子矩阵的左上角坐标和右下角坐标。每个操原创 2021-02-22 23:38:26 · 262 阅读 · 0 评论 -
二维前缀和
二维前缀和核心操作:代码如下:#include <iostream>using namespace std;const int N = 2000;int mp[N][N];int dp[N][N];int main() { int n, m, k; cin >> n >> m >> k;//矩阵为n*m,k次查询 for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j+原创 2021-03-02 00:11:46 · 187 阅读 · 0 评论