算法学习
每天干饭就
这个作者很懒,什么都没留下…
展开
-
堆排序 代码
#include <iostream>using namespace std;const int maxn=8;int a[maxn]={36,30,18,40,32,45,22,50};//假设一颗完全二叉树,其左右子树都是堆,调整后会破坏一颗子树的堆结构,需要再对该子树进行调整 void heapAdjust(int k,int last) //k为要调节的结点,last为最终结点 { int i=k,j=2*i+1,temp; //i指向要调整的结点,j指向i的左孩子原创 2021-09-04 22:09:44 · 67 阅读 · 0 评论 -
汉诺塔递归的c语言递归实现
#include <iostream>#include <cstdio>using namespace std;void move(int n,char from,char rely,char to){ if(n==1) { printf("%c -> %c\n",from,to); } else { move(n-1,from,to,rely); printf("%c -> %c\n",from,to); move(n-1,rely,原创 2021-01-06 15:42:32 · 134 阅读 · 0 评论 -
动态规划求组合数
直接切入正题:给一个组合数C(n,k),用公式直接求固然可以,但是直接求阶乘会有两个麻烦:1、数据过大时,k!和(n!/(n-k)!) (尽管已经化简)还是很容易溢出int的范围或longlong的范围,我们当然不能用mod运算来规避,因为mod运算是不能用在除法上的,即(a/b) mod p != (a mod p) / (b mod p)。2、我们总共需要计算k!+(n!/(n-k)!) 次乘法+一次除法,这是一个O(n!)的算法,很容易超时。动态规划解法:初中有一种类型的题,可以将矩阵和组合原创 2020-12-11 11:25:55 · 2286 阅读 · 0 评论 -
PAT乙级(Basic Level)真题 前十四题 (50块代金券)
PAT乙级的题目对初学者比较友好,可以巩固基础,写完了还能拿50块代金券。题目网址链接:link.1001:A+B和C(15)#include <iostream>#include <cstdio>using namespace std;typedef long long ll;int cas=0,t;int main(){ int t; ll a,b,c; cin>>t; while(t--) { cin>>a>>原创 2020-12-03 17:08:56 · 305 阅读 · 0 评论 -
操作系统——连续动态内存管理模拟实现
引子连续动态内存管理,该实验其实就是对双向链表进行操作来模拟内存分配,比起普通链表更细心一点就行。一、实验目的1) 理解内存管理相关理论;2) 掌握连续内存管理理论;3) 掌握动态连续内存管理理论。二、实验内容本实验主要针对操作系统中内存管理相关理论进行实验,要求实验者编写一个程序,该程序管理一块虚拟内存,实现内存分配和回收功能。1) 模拟管理 64M 的内存块;2) 设计内存分配函数;3) 设计内存回收函数;4) 实现动态分配和回收操作;5) 可动态显示每个内存块信息。三、实验原原创 2020-12-02 10:57:17 · 5242 阅读 · 2 评论 -
操作系统—银行家算法(一个大鱼吃小鱼的游戏,一看就懂)
最近上操作系统课学到了银行家算法,起初看课本觉得这个讲的是什么,仔细研究了一下发现这个算法最重要的一点就是安全性检查了。先说一下这个算法模拟的是什么过程:假设有一个银行,里面有人民币、美元、日元、韩币等资源,有许多客户向银行申请贷款。每个客户都可以发出申请先贷款一部分,也可以发出申请贷款全部,比如有个客户想贷款人民币3元、美元2元、日元1元,那么他每种资源只贷款1元也可以。银行要做的事情就是判断这个客户的申请是否是狮子大开口,贷款的资源超过了他的需求。如果不是,再判断银行是否有分配给这个客户钱的能力原创 2020-11-12 17:13:09 · 2302 阅读 · 4 评论 -
蓝桥杯刷题 学霸的迷宫 bfs
题目链接此题利用了bfs的性质,bfs只会按照定义的规则访问每一个结点,并且只会访问一次。在这一题中字典序最小是题目的限制,所以我们定义访问结点的规则为(DLRU)满足字典序最小即可。这样当bfs访问一个结点时,则一定是最以字典序最小的方式访问这个结点,并且访问后就不会访问第二次,相比于dfs剩下了许多时间。AC代码:#include <iostream>#include <cstdio>#include <cstring>#include <q原创 2020-10-11 22:14:18 · 179 阅读 · 0 评论 -
UVA 208 消防车(回溯法)
#include <iostream>#include <cstdio>#include <cstring> using namespace std;const int maxn=22;int k,map[maxn][maxn],tot;int vis[maxn]; //vis数组 int route[maxn]; //路径数组,用来回溯法int to_k[maxn]; //to_k[x]判断x结点是否可以到达终点 void init(int原创 2020-10-10 12:42:49 · 148 阅读 · 0 评论 -
UVA 225 黄金图形(回溯法)详细注释
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const int maxn=220,O=105; //O代表中心点(0,0)的坐标 const char dr[]="ensw"; //东北南西 const int dx[]={0,1,-1,0};const int dy[]={1,0,0,-原创 2020-10-10 12:33:32 · 217 阅读 · 0 评论 -
八数码 set集合版和哈希表版 (打印结果版本)
#include <iostream>#include <cstdio>#include <cstring>#include <set>#include <vector>using namespace std;typedef int State[9];const int maxstate=1e7+5;const int dx[]={-1,1,0,0};const int dy[]={0,0,-1,1};State st[maxs原创 2020-09-27 13:03:30 · 125 阅读 · 0 评论 -
牛客网——牛牛家的房子
#include <iostream>#include <cstdio>#include <vector>#include <cmath>using namespace std;const int maxn=22;int n,r;struct House{ int te,num; //te为房子温度,num为房子里的人数 }; House houses[maxn][maxn];bool can_reach(int& x,in原创 2020-09-17 21:46:40 · 159 阅读 · 0 评论 -
子集生成—二进制法(详细注释)
#include <iostream>#include <cstdio>using namespace std;/*程序用途:输入一个n,打印集合{0,1,2,3,...,n-1}的所有子集(包含空集和本身)*///原理:若集合大小为n,则其子集的大小为2的n次方(包括空集和本身)//举例 n=3,则{0,1,2}的子集为{},{0},{1},{2},{0,1},{0,2},{1,2},{0,1,2}//则咱们可以用000表示{},001表示{0},010表示{1},1原创 2020-09-09 23:28:37 · 519 阅读 · 0 评论 -
CSP认证刷题 稀疏向量 map
#include <iostream>#include <cstdio>#include <map>using namespace std;const int maxn=5e5+10;int n,a,b;struct Vector{ int index,value;};Vector u[maxn];map<int,int> v;int main(){ long long sum=0; cin>>n>>原创 2020-08-11 16:04:09 · 394 阅读 · 0 评论 -
UVA 140 带宽 回溯法 剪枝 (参考刘汝佳老师代码)
#include <iostream>#include <cstring>#include <cstdio>#include <vector>#include <algorithm>using namespace std;char input[1000];int id[256],P[10],pos[10],best[10];...原创 2020-01-18 11:33:13 · 189 阅读 · 0 评论