- 博客(12)
- 资源 (1)
- 收藏
- 关注
原创 数论算法--快速幂、欧几里得算法、扩展欧几里得算法、求逆元、线性同余方程
快速幂 markdown中符号不太好打,举个例子:311=31011=38+32+313^{11}=3^{1011}=3^8+3^2+3^1311=31011=38+32+31 代码如下: typedef long long ll; int qmi(int a,int k,int p){ // quickMi的缩写 int res=1; while(k){ if(k&1)res=(ll)a*res%p; // 乘法有可能溢出 k>>=1;
2021-05-09 23:01:14
281
原创 快速选择算法
算法思想 基于快排,每次递归通过比较当前长度与k的大小从而判断进入哪一个递归 若k<=sl,则第k小的数一定在左边,进入quick_searck(a,l,j,k)寻找左边第k小的数 若k>sl,则第k小的数一定在右边,进入quick_searck(a,j+1,r,k-sl)寻找第sl-k小的数 代码如下 const int N=1e5+10; int a[N]; int n,k; int quick_search(int a[],int l,int r,int k){ if(l=
2021-04-29 21:44:28
96
原创 符号匹配+表达式求值
符号匹配 const int N=100010; char stk[N]; // 规定符号只有[({})]这六种 int top; map<char,int>a; void init(){ a['(']=1,a[')']=1,a['{']=2,a['}']=2,a['[']=3,a[']']=3; } bool isTrue(string str){ if(!str.size())return true; for(int i=0;i<str.size();i++){
2021-04-28 20:49:40
141
原创 数组模拟堆
堆的基本操作 堆的基本操作 heap.top() heap.pop(x) heap.push() heap.remove(k) // 删除第k个节点 heap.alter(k,x) // 修改第k个节点为x 用数组来实现堆的存储方式:用x表示父节点,2*x为左孩子,2*x+1为右孩子 若实现的是小根堆,则存在父节点>左孩子节点,父节点>右孩子节点 我们定义两个操作来实现堆 down操作 down操作主要用来将当前节点向下移动到正确的位置 void down(int x){
2021-04-23 20:29:53
163
原创 最小生成树算法(Prim算法与Kruskal算法)
Prim算法(稠密图) 伪代码 1. 将1号节点加入最小生成树 2. 寻找不在生成树中的顶点到生成树的最短边 // O(n) ,可用小根堆优化为O(log m) 3. 将其加入最小生成树 4. 更新所有节点到最小生成树的距离 5. 重复2-4操作,直到循环n次,或者第二步得到的最短边为INF时 结束循环。 C++代码如下 const int N=510,INF=0x3f3f3f3f; int g[N][N],dist[N]; int n,m; bool st[N]; // 是否在最小生成树中 in
2021-04-23 19:08:48
185
原创 带负权边的单源最短路径算法
const int N=510,M=1e5+10,INF=0x3f3f3f3f; int n,m,k; int dist[N],last[N]; struct Edge{ int a,b,w; }edges[M]; void bellmen_ford(){ memset(dist,0x3f,sizeof dist); dist[1]=0; for(int i=0;i<k;i++){ memcpy(last,dist,sizeof dist);
2021-04-23 15:26:23
321
原创 dijkstra算法
const int N=510,INF=1e9; int g[N][N]; // g[i][j] 存的是第i点到第j点的距离 int dis[N]; // dis[i] 存的是第一个点到第i点的距离 int n,m; // n为顶点数,m为边数 bool st[N]; // st[]存已经是最短路径的点 void dijkstra(){ memset(dis,0x3f,sizeof dis); // dis 初始化为0x3f3f3f3f (任意一个取不到的值即可) dis
2021-04-22 15:17:53
132
原创 用数组实现单链表(不带头结点)
直接贴上代码 const int N=100010; int e[N]; // 存储每一个插入的值 int ne[N]; // 指向x接点的下一个节点 int idx; // 给每一个插入的结点编号 int head=-1; // 头指针,初始化为-1 void Init(){ head=-1; idx=0; } void add_to_head(int x){ e[idx]=x; // Node*temp=new Node(x); ne[
2021-04-17 14:17:45
140
原创 C++高精度算法模板(加减乘除)
主函数模板 加减法模板 #include<iostream> #include<vector> #include<algorithm> using namespace std; vector<int>a,b; int main(){ string s1,s2; cin>>s1>>s2; for(int i=s1.size()-1;i>=0;i--)a.push_back(s1[i]-'0'); fo
2021-04-13 22:02:58
958
原创 LeetCode 股票买卖问题模板 (121 、122、123、188、309、714题)
最近在刷leetcode的DP,发现对于我而言难度有点大,特此记录刷题的过程,本文讲的是6个股票买卖的通用模板。 股票买卖问题1 股票买卖问题2 股票买卖问题3 股票买卖问题4 解题的原理可以这里给出,因此写的实在太好,就不再赘述,建议看完上述参考链接之后再看本文。 ...
2020-11-29 19:43:54
210
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人