算法实现
代码实现算法
东风街大饼工厂
这个作者很懒,什么都没留下…
展开
-
给日期直接算出星期几------O(1)时间复杂度
给日期直接算出星期几------O(1)时间复杂度原创 2022-07-13 22:21:52 · 259 阅读 · 0 评论 -
并查集模版(C++)
#include<bits/stdc++.h>using namespace std;const int N = 1e5;int f[N];//寻找根节点 int find(int x){ if(x != f[x]) f[x] = find(f[x]); return f[x];}//合并两个节点 void Union(int a,int b){ int pa = find(a); int pb = find(b); if(pa != pb){ f原创 2022-04-14 19:34:13 · 901 阅读 · 0 评论 -
求组合数C(a,b)代码模版(C++)
int C(int a, int b) //计算C(a,b){ LL res = 1; for(int i = a, j = 1; j <= b; i --, j ++) { res = res * i / j; if(res > n) return res; // 大于n已无意义,且防止爆LL } return res;}...原创 2022-03-24 20:09:18 · 2233 阅读 · 0 评论 -
树状数组(C++实现)
#include<bits/stdc++.h>using namespace std;const int N = 100;int A[N]; int C[N];int n;int lowbit(int x){ return (-x) & x;}//计算从A[1]开始到A[x]的和 即前缀和 int sum(int x){ int ret = 0; while(x > 0){ ret += C[x]; x -= lowbit(x); } r原创 2022-02-12 16:09:32 · 435 阅读 · 0 评论 -
高精度减法(易记)
#include<bits/stdc++.h>using namespace std;int a[500], b[500], c[500]; void rv(int arr[], string s){ for(int i=1;i<=s.size();i++) arr[i] = s[s.size()-i] - '0'; }int main(){ string s1,s2; cin>>s1>>s2; rv(a,s1); rv(b,s2)原创 2022-02-07 11:40:57 · 162 阅读 · 0 评论 -
高精度加法(易记)
#include<bits/stdc++.h>using namespace std;int a[500],b[500],c[500];//逆序存放 void rv(int arr[],string s){ for(int i=1;i<=s.size();i++) arr[i] = s[s.size()-i] - '0';}int main(){ string s1,s2; cin>>s1>>s2; rv(a,s1); rv(原创 2022-02-07 11:35:03 · 169 阅读 · 0 评论 -
最长公共字串(C++动态规划)
输出长度#include<bits/stdc++.h>using namespace std;char a[10005],b[10005];int f[10005][10005];int main(){ int i,j,ans = -1; int x; scanf("%s %s",&a,&b); for(i=1;i<=strlen(a);i++){ for(j=1;j<=strlen(b);j++){ if(a[i-1] == b[j-原创 2022-02-01 18:38:22 · 382 阅读 · 0 评论 -
和最大的子序列(C++动态规划)
#include<bits/stdc++.h>using namespace std;int a[100000];int sum[100000];int n;int main(){ int head = 0,tail,ans = -1; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; //获得以1到i的和 记录在sum数组中 for(int i=1;i<=n;i++) sum[i] = sum[i原创 2022-02-01 10:05:59 · 313 阅读 · 0 评论 -
最长不下降子序列(C++二分查找)
#include<bits/stdc++.h>using namespace std;int a[100];int b[100];//b中存储的不是最长上升子序列 int len = 1;//字符串长度为1时 最长上升子序列长度为1 //二分查找 int bs(int x){ int l = 1,r = len; int mid; //返回第一个大于x的元素的下标 while(l <= r){ mid = l+(r-l)/2; if(x > b[m原创 2022-02-01 09:28:16 · 451 阅读 · 0 评论 -
最长不下降子序列(C++动态规划)
#include<bits/stdc++.h>using namespace std;int a[100];int dp[100];//记录状态的数字 int main(){ int n,ans = -10; cin>>n; //当只有一个字符的时候 最长上升子序列为1 for(int i=1;i<=n;i++) dp[i] = 1; for(int i=1;i<=n;i++) cin>>a[i]; for(int i.原创 2022-02-01 09:26:10 · 1292 阅读 · 0 评论 -
最长上升子序列长度(C++二分查找)
#include<bits/stdc++.h>using namespace std;int a[100];int b[100];//b中存储的不是最长上升子序列 int len = 1;//字符串长度为1时 最长上升子序列长度为1 //二分查找 int bs(int x){ int l = 1,r = len; int mid; //返回第一个大于或等于x的元素的下标 while(l <= r){ mid = l+(r-l)/2; if(x >原创 2022-02-01 09:08:59 · 709 阅读 · 0 评论 -
最长上升子序列(C++动态规划)
#include<bits/stdc++.h>using namespace std;int a[100];int f[100];int main(){ int n,ans = -10; cin>>n; //当只有一个字符的时候 最长上升子序列为1 for(int i=1;i<=n;i++) f[i] = 1; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=2;i<=n;i+原创 2022-02-01 08:45:02 · 1024 阅读 · 0 评论 -
生成1-n全排(C++)
#include<bits/stdc++.h>using namespace std;void print_permutation(int n,int *A,int cur){ if(cur == n){ for(int i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); }else{ for(int i=1;i<=n;i++){ int ok = 1; for(int j=0;j<cur;j++) i原创 2022-01-10 23:07:02 · 418 阅读 · 0 评论 -
生成1-n全排(C++容易理解)
#include<bits/stdc++.h>using namespace std;int A[20],vis[20];int n;//生成1到n的全排void dfs(int cur){ if(cur == n){ for(int i=0;i<n;i++) printf("%d ",A[i]); printf("\n"); }else for(int i=1;i<=n;i++){ if(!vis[i]){ A[cur] = i; vis[i]原创 2022-01-12 19:25:30 · 672 阅读 · 1 评论 -
01背包模版(C++滚动数组优化)
#include<bits/stdc++.h>using namespace std;//dp[i]表示i容量的体积能得到的最大价值 //c[i]表示第i个物体的体积//v[i]表示第i个物体的价值 int t,m,dp[1010],c[105],v[105];int main(){ cin>>t>>m;//t为物体个数 m为背包容量 for(int i=1;i<=m;i++) cin>>c[i]>>v[i]; //原创 2022-01-18 23:34:26 · 190 阅读 · 0 评论 -
取数求和(C++回溯法)
#include<bits/stdc++.h>using namespace std;vector<int> v;int a[110],vis[110];int n,m,cnt,sum =0;void dfs(int cur){ if(sum == m) { for(int i=0;i<v.size();i++) cout<<v[i]<<" "; cout<<endl; cnt++; return ;原创 2022-01-19 00:13:23 · 448 阅读 · 0 评论 -
完全背包模版(C++滚动数组优化)
#include<bits/stdc++.h>using namespace std;typedef long long ll;const ll N = 1e7 + 10;ll t,m,c[N],v[N],dp[N];int main(){ cin>>t>>m; for(int i=1;i<=m;i++){ cin>>c[i]>>v[i]; } for(int i=1;i<=m;i++){ for(i原创 2022-01-19 18:32:48 · 469 阅读 · 0 评论 -
不用数组实现杨辉三角(C++)
#include<bits/stdc++.h>using namespace std;int n,C[100];int main(){ cin>>n; int flag = 1; if(n == 1) {cout<<"1";return 0;} cout<<"1"<<endl; for(int i=1;i<=n-1;i++){ flag = 1; cout<<flag<<" ";原创 2022-01-21 19:11:04 · 456 阅读 · 2 评论 -
快速排序(C++)
#include<bits/stdc++.h>using namespace std;int a[5] = {2,3,4,35,50};void swap(int &a,int &b){ int temp = a; a = b; b = temp;}//选取数组最后一个元素作为基准 int partition(int arr[], int low, int high){ int pivot = arr[high]; int i = low; for原创 2022-01-24 14:45:14 · 295 阅读 · 0 评论 -
快速排序优化(C++)
#include<bit/stdc++.h>using namespace std;int n,a[1000005];void qsort(int l,int r)//应用二分思想{ int mid=a[(l+r)/2];//中间数 int i=l,j=r; do{ while(a[i]<mid) i++;//查找左半部分比中间数大的数 while(a[j]>mid) j--;//查找右半部分比中间数小的数原创 2022-01-24 22:51:45 · 170 阅读 · 0 评论 -
通过中序和后序遍历字符串输出前序遍历(C++)
#include<bits/stdc++.h>using namespace std;void dfs(string in,string post){ if(in.size() > 0){ char root = post[post.size()-1];//从后序遍历得到根结点 cout<<root; int k = in.find(root);//找到根结点在中序遍历字符串中的位置 dfs(in.substr(0,k), post.substr(原创 2022-01-25 17:23:02 · 735 阅读 · 0 评论 -
多重背包朴素算法模版(C++)
#include<bits/stdc++.h>using namespace std;const int maxn = 100000;int n,m,dp[maxn];int v[maxn],w[maxn],s[maxn];int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>v[i]>>w[i]>>s[i]; for(int i=1;i<=n;i++原创 2022-01-29 13:04:21 · 393 阅读 · 0 评论 -
两个字符串的最长公共子序列(C++动态规划)
#include<bits/stdc++.h>using namespace std;char a[200];char b[200];int f[201][201];//记录长度char p[201][201];//记录公共字符int m,n;void LCS(){ int i,j; for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ if(a[i-1] == b[j-1]){ //左上方存放的一直是公共字符原创 2022-01-31 11:49:46 · 929 阅读 · 0 评论 -
通过中序遍历和后序遍历构建二叉树
struct node{ int data; node* lchild; node* rchild;};int n;int in[maxn],post[maxn];//数组node* create(int h1,int h2 ,int l){ if(!l) return nullptr; node* p = new node(); p->data = post[h2+l-1]; int i; for(i=0;;i++) if(p原创 2021-09-26 12:45:58 · 63 阅读 · 0 评论 -
高精度算法(高精度数与低精度数除法)
高精度除法(高精度数与低精度数除法)#include<bits/stdc++.h>using namespace std;char s1[5005];long long b,c[5005],a[5005],x,la,lb,lc;int main(){ int ys; cin>>s1>>b; la = strlen(s1); for(int i=1;i<=la;i++) a[i] = s1[i-1] - '0'; for(int i=1;i<原创 2021-10-02 14:30:06 · 298 阅读 · 0 评论 -
高精度算法(大数与大数之间的加法)
高精度加法//高精度加法#include<bits/stdc++.h>using namespace std;char s1[505],s2[505];int a[505],b[505],c[505];int main(){ int la,lb,lc; scanf("%s",&s1); scanf("%s",&s2); la = strlen(s1); lb = strlen(s2); for(int i=0;i<la;i++) a[la-i] =原创 2021-10-01 19:30:50 · 81 阅读 · 0 评论 -
高精度算法(大数与大数之间的减法)
的原创 2021-10-02 13:27:45 · 66 阅读 · 0 评论 -
高精度算法(大数与大数之间的乘法)
高精度乘法#include<bits/stdc++.h>using namespace std;char s1[2005],s2[2005];int a[2005],b[2005],c[2005];int main(){ int la,lb,lc; scanf("%s",&s1); scanf("%s",&s2); la = strlen(s1); lb = strlen(s2); for(int i=0;i<la;i++) a[la-i] = s1[原创 2021-10-02 13:53:51 · 86 阅读 · 0 评论 -
创建一颗二叉搜索树(又称二叉排序树和二叉查找树)
代码如下#include<iostream>using namespace std;//二叉树存储结构 struct node{ int val; node *l,*r; //构造函数,申请内存空间时可以直接传值初始化val为0,左右孩子为NULL node(int val = 0, node *l = NULL, node *r = NULL) :val(val), l(l), r(r) {}};//创建一颗二叉搜索树 void create(node *&a原创 2021-10-22 13:39:32 · 308 阅读 · 0 评论 -
插入排序(代码实现)
#include<stdio.h> void insertionSort(int Arr[],int N){ int i,j,temp; for(i=1;i<N;i++){ temp = Arr[i];//当前需要排序的元素 j = i - 1;//需要排序元素前一个元素索引 //将当前元素与前面的元素进行对比 //当j小于0退出时,需排序的元素插入到最前面 //当Arr[j]<=temp退出时,需排序元素插入Arr[j]后面 while(j原创 2021-10-13 19:17:56 · 460 阅读 · 0 评论 -
矩阵连乘算法
#include<iostream>using namespace std;const int N = 1000;int A[N];//矩阵规模int m[N][N];//最优解int s[N][N];//断开的位置k(s[i][j])void MatrixChain(int n){ int r, i, j, k; for (i = 0; i <= n; i++)//初始化对角线 { m[i][i] = 0; } for (r = 2; r <= n; r原创 2021-10-22 11:24:30 · 268 阅读 · 0 评论 -
并查集(代码实现)
代码实现如下#include<iostream>using namespace std;int father[1000];//一般初始化成-1或者father[i]=i void init(){ for(int i=0;i<=300;i++){ father[i] = i; }}//寻找父结点 int findRoot(int x){ while(x != father[x]){ x = father[x]; //一直向上寻找根结点 } retu原创 2021-10-13 14:35:51 · 130 阅读 · 0 评论 -
最小公倍数(C++)
int gcd(int a,int b){ return b == 0 ? a : gcd(a,a%b);}int lcm(int a,int b){ return a*b / gcd(a,b);}原创 2022-01-09 21:39:12 · 1846 阅读 · 0 评论 -
二分查找(C++)
#include<bits/stdc++.h>using namespace std;int bsearch(int *A,int l,int r,int v){ while(l <= r){ int mid = l + (r-l)/2; if(v == A[mid]) return mid;//找到之后返回下标值 else if(v > A[mid]) l = mid + 1;//要找的值比中间大就向右边找 else r = mid - 1;//要找的原创 2022-01-16 10:39:41 · 262 阅读 · 0 评论 -
Dijkstra最短路径算法
#include<bits/stdc++.h>#define INF 0x3f3f3f3fusing namespace std;const int M = 1e4 + 10;const int N = 1000 + 10;int n,m,s;int mp[N][N];int dis[N],vis[N];void initmp(){ memset(mp,INF,sizeof(mp));}void Dijkstra(int s){ //s是源点 memset(vis,原创 2021-11-21 12:06:42 · 185 阅读 · 0 评论 -
埃氏筛选素数(C++)
#include<bits/stdc++.h>using namespace std;int vis[10000];int main(){ int n = 1000; int m = sqrt(n+0.5); for(int i=2;i<=m;i++) if(!vis[i]) //i从2开始,将2的倍数都筛掉,下一次i从3开始,把3的倍数全都筛掉 for(int j=i*i;j<=n;j+=i) vis[j] = 1;//赋值为1的都为非素数 f原创 2022-01-09 21:04:37 · 529 阅读 · 0 评论 -
最大公约数(C++)
int gcd(int a,int b){ return b == 0 ? a : gcd(a,a%b);}原创 2022-01-09 21:38:14 · 281 阅读 · 0 评论