
C/C++
文章平均质量分 81
C/C++笔记
cout0
这个作者很懒,什么都没留下…
展开
-
【C++】线段树
简介线段树是一种特殊的数据结构,他适用于进行区间RMQ问题。线段树的逻辑结构是一颗二叉树,叶子节点统计的是端点信息,而其余父节点统计的是所有子结点的信息,父结点也就构成了一个个统计区间,这些区间就像是线段,线段树因此得名。首先,线段树是一颗平衡二叉树,因此搜索效率极高。通常,线段树是一颗普通的平衡二叉树,这种二叉树实现较为复杂,如下图所示:(图片来自网络,侵删)zkw大佬在《统计的力量》PPT中介绍了一种更易于实现的线段树,这种线段树一般也被称为zkw线段树。zkw线段树是一颗满二叉树,可以直接原创 2021-12-08 17:06:45 · 1432 阅读 · 0 评论 -
【博弈论】威佐夫博弈
简介威佐夫博弈(Wythoff GameWythoff\ GameWythoff Game):有两堆物品个数是nnn和mmm,甲乙两个人轮流从一堆选取kkk个物品或两堆中选取各选取kkk个物品,最后取完物品的人获胜。思路两堆物品数用(n,m)(n,m)(n,m)表示,满足n≤mn\le mn≤m,如果n>mn>mn>m则交换nnn与mmm。现考虑各种状态,发现先手必输态如下:当n=0n=0n=0时,(0,0)(0,0)(0,0)没有物品甲必败,(0,m≠0原创 2021-12-08 17:05:16 · 392 阅读 · 0 评论 -
【博弈论】斐波那契博弈
斐波那契博弈简介一堆有nnn个物品,如果有甲乙两个人。甲和乙轮流从这对物品中选取物品,第一次可以取1∼n−11\sim n-11∼n−1个物品,后一个人能取的物品数范围是111到前一个人取的物品数222倍,最后取光物品的人获胜。思路若甲先手,设当前物品数为rrr。当r≤3r\le 3r≤3时,甲无法取胜,甲必败。当r=4r=4r=4时,甲取111,乙剩333个无法取胜,故甲必胜。当r=5r=5r=5时,甲若取222个及以上乙必胜。甲若取111个,乙取111个又变成了r=3r=3r=3的情况,乙原创 2021-12-08 17:04:27 · 685 阅读 · 0 评论 -
【博弈论】巴什博弈
巴什博弈简介巴什博弈(Bash Game):一堆有nnn个物品,如果有甲乙两个人。甲和乙轮流从这对物品中选取1∼m1\sim m1∼m个物品,最后取光物品的人获胜,也就是没有取完物品的人输。思路若甲先手,设当前物品数为rrr。当r≤mr\le mr≤m时,甲可一次取完,获胜。当r=m+1r=m+1r=m+1时,甲无论取多少都会输。当m+2≤r≤2mm+2\le r\le 2mm+2≤r≤2m时,甲可以取r−(m+1)r-(m+1)r−(m+1)个,使得无论如何乙取走后剩余个数不超过mmm个,甲原创 2021-12-08 17:03:55 · 1505 阅读 · 0 评论 -
【C++】堆排序
前言本文采用结构体重载比较运算符的方式进行大根堆的建立,算法逻辑类似STLSTLSTL的priority_queuepriority\_queuepriority_queue。结构体堆本身就是一颗完全二叉树,所以本身用数组存储就行。int heap[N];输入堆for(int i=1;i<=n;i++} cin>>heap[i];向上调整堆建堆后,从第一个非叶结点开始向前递减循环,依次比较堆是否比最大的孩子小,是的话则交换。void adjustUp(){ f原创 2021-12-08 17:03:01 · 218 阅读 · 0 评论 -
【C++】IDA*算法
算法简介IDA*(ID A*)算法是一种启发式搜索算法,他是采取了迭代加深的A∗A^*A∗算法,使用了深度优先搜索的方式(根据百度百科的说法,IDA*不是基于迭代加深的A∗A^*A∗算法,是迭代加深与全局最优性剪枝的A∗A^*A∗算法)。相对于A∗A^*A∗算法,IDA*算法主要解决了:A∗A^*A∗算法需要判重,对优先级排序的问题。A∗A^*A∗算法使用堆,需要大量空间存储的问题。算法思想IDA*算法的基本思想是设置一个搜索深度,这个搜索深度从0开始依次递增。使用深度优先搜索在这个深度内搜原创 2021-12-08 17:01:41 · 1669 阅读 · 0 评论 -
【C++】A*算法
算法简介A∗A^*A∗(A starA\ starA star)算法是一种启发式搜索算法,主要实现对图的路径搜索。A∗A^*A∗算法基于BFSBFSBFS(广度优先搜索),由于BFSBFSBFS具有盲目性,会进行许多偏离最佳路径的搜索,故此A∗A^*A∗算法主要目的就是克服BFSBFSBFS的盲目性,在进行光度搜索时有目的的选择搜索结点。算法思想在学习A∗A^*A∗算法之前,首先需要引入评估函数f(n)=h(n)+g(n)f(n)=h(n)+g(n)f(n)=h(n)+g(n),它原创 2021-12-08 16:58:07 · 1307 阅读 · 0 评论 -
【C++】Tarjan算法
相关介绍强连通分量在有向图中,如果某一个子图的任意两点都是连通的则该子图是一个强连通分量。算法简介TarjanTarjanTarjan算法有好几种,都是以TarjanTarjanTarjan命名的,这里讲的TarjanTarjanTarjan指求强连通分量的TarjanTarjanTarjan算法,他以深度优先搜索的方式对图进行染色,进而求得强连通分量。算法思想在一个顶点数为nnn的图中,TarjanTarjanTarjan算法需要维护一个顶点栈和几个数组。stack Sstack原创 2021-12-08 16:56:02 · 1003 阅读 · 2 评论 -
【C++】Floyd算法
算法简介FloydFloydFloyd算法是多源最短路径算法,即可以求任意两点的最短路径,它基于动态规划的思想,时间复杂度为O(n3)O(n^3)O(n3)。它的创始人罗伯特·弗洛伊德(Robert W.Floyd)(Robert\ W.Floyd)(Robert W.Floyd)将此算法命名为Floyd−WarshallFloyd-WarshallFloyd−Warshall算法,简称FloydFloydFloyd算法。罗伯特·弗洛伊德是1978年图灵奖得主,他同时还创立了堆排序算原创 2021-11-09 10:09:01 · 674 阅读 · 0 评论 -
【C++】Ford算法和SPFA算法
算法简介Bellman−FordBellman-FordBellman−Ford(以下简称FordFordFord)算法是一种单源最短路径算法,他由Richard BellmanRichard\ BellmanRichard Bellman和Lester FordLester\ FordLester Ford提出并因此得名,其中Richard BellmanRichard\ BellmanRichard Bellman是动态规划的提出中。Ford原创 2021-11-09 10:08:31 · 392 阅读 · 0 评论 -
【C++】Dijkstra算法
算法简介迪杰斯特拉(Dijkstra)算法是图论中的最短路算法,它可以实现求解特定起点到任一点的最短路径。对于顶点个数为nnn的图,如果需要求解每两个点之间的最短路径则需要跑nnn次迪杰斯特拉算法。迪杰斯特拉的时间复杂度为O(n2)O(n^2)O(n2),缺点是不适用于带负权边的图。算法思想迪杰斯特拉算法基于贪心的思想,不断地寻找中间结点www使得u→w→vu\to w\to vu→w→v的距离小于u→vu\to vu→v的距离,即用中间值更新结果。相似算法思想参考朴素迪杰斯特拉算法邻接矩阵法。朴原创 2021-11-09 10:08:00 · 8735 阅读 · 2 评论 -
【C++】树状数组
定义所谓树状数组,逻辑结构是一棵树,但是采用数组实现,他能解决单点修改区间查询类的问题,属于前缀和的一种优化。lowbit学习树状数组,首先要引入lowbit概念,所谓lowbit,指的是二进制数最低位的111的权值,比如二进制数110011001100的lowbit就是二进制表示就是100100100,也就是权值为22=42^2=422=4,下文中我们用lowbit(x)表示x的lowbit值。树状数组结构...原创 2021-11-02 10:13:50 · 1446 阅读 · 0 评论 -
【C++】递推&动态规划基础入门
斐波那契递归式斐波那契函数long long fib(long long k){ if(k==1||k==2) return 1; return fib(k-1)+fib(k-2);}上述函数存在一定的问题,比如fib(n)=fib(n−1)+fib(n−2),fib(n−1)=fib(n−2)+fib(n−2)fib(n)=fib(n-1)+fib(n-2),fib(n-1)=fib(n-2)+fib(n-2)fib(n)=fib(n−1)+fib(n−2),fib(n−1)=fib(n−2原创 2021-09-29 20:12:33 · 873 阅读 · 0 评论 -
【C++】数论
排列组合排列排列的定义:从n个不同元素中,任取m(m≤n,m与n均为自然数)个不同的元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列,从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)A(n,m)A(n,m)或AnmA_n^mAnm表示。A(n,m)=n∗(n−1)∗(n−2)∗...∗(n−m+1)=n!(n−m)!A(n,m)=n* (n-1) * (n-2)* ... * (n-m+1)=\frac{n!原创 2021-10-24 21:52:29 · 1812 阅读 · 0 评论 -
【C++】简单图
存储方法以下图为例,分别用邻接矩阵和邻接表建图。#mermaid-svg-Ru4dOxZNLSBeuzlz .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-Ru4dOxZNLSBeuzlz .label text{fill:#333}#mermaid-svg-Ru4dOxZNLSBeuzlz .node re原创 2021-10-19 10:33:32 · 394 阅读 · 0 评论 -
【C++】树与二叉树
二叉树二叉树:最多分两叉的有序树。#mermaid-svg-ONpOkFFpZAqPMzXW .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-ONpOkFFpZAqPMzXW .label text{fill:#333}#mermaid-svg-ONpOkFFpZAqPMzXW .node rect,#m原创 2021-10-18 22:55:02 · 289 阅读 · 0 评论 -
【C++】扩展格雷码生成算法
定义一组mmm进制的nnn位格雷码,是一组有序的、无重复的、mmm进制nnn位数。这组数中一共有mmm的nnn次方个数。相邻的(因有序,所以有相邻的概念)两个数之间有且只有一位是不同的。这组数的第一个和最后一个数,也被视为相邻的数。输入一行nnn和mmm,分别表示格雷码位数和进制,其中2≤n≤12,2≤m≤10,mn≤50000002\le n\le 12, 2\le m \le 10, m^n\le 50000002≤n≤12,2≤m≤10,mn≤5000000输出任意一种格雷码编码方案,每个编原创 2021-10-11 12:06:00 · 750 阅读 · 1 评论 -
【C++】贪心算法入门
简介贪心算法又叫贪婪算法,对于局部最优解就是全局最优解的问题,可以按照局部最优解的决策层层递进获得全局最优解。例题01背包题目描述有nnn个物品,物品i的体积为v[i]v[i]v[i]。现有一个容量为CCC背包,请计算该背包能装载物品的最大数量。注意:每个物品要么全装入,要么不装入,不能只装一部分。输入格式第111行是nnn和CCC;接下来一行有nnn个整数,第iii个数表示物品的体积v[i]v[i]v[i]。输出格式输出一个整数,表示能装入的最大物品数量。样例输入6 101原创 2021-09-29 21:43:20 · 1800 阅读 · 3 评论 -
【C++】回溯算法基础入门
简介回溯算法基于深度优先搜索,实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。由于非递归式回溯算法较难实现,本文只介绍递归式回溯。回溯算法框架int a[n+1];//这里用下标1~nvoid DFS(int i){//搜索第i层 if(i>n){//搜索结束 //结果处理(输出结果,方案计数等) } for(int j=下界;j<=上界;j++){ if(限界函数&&约束条原创 2021-09-29 20:10:35 · 2936 阅读 · 0 评论 -
【C++】飞机大战
闲来没事做了个飞机大战的雏形主要用了Windows API控制界面刷新和隐藏光标。#include <stdio.h>#include <conio.h>#include <time.h>#include <Windows.h>int score=0,enemy_x=0,enemy_y=4,bullet_x=-1,bullet_y=0,my_x=8,my_y=2,step=1;int space_x=3,space_y=4;void gotox原创 2021-09-15 16:03:14 · 1117 阅读 · 0 评论 -
【洛谷P3374 P3368】树状数组
提示本文只记录模板,不做详细解释P3374 树状数组1原题链接#include <iostream>#define lowbit(x) x&(-x)#define N 5*(int)1e5+1using namespace std;int n,m,num[N];long long tree[N];void add(int idx,int val){ while(idx<=n){ tree[idx]+=val; idx+=lowbit(idx); }原创 2021-08-20 13:26:35 · 142 阅读 · 0 评论 -
【C++】高斯消元算法
题目链接题目背景Gauss消元题目描述给定一个线性方程组,对其求解输入格式第一行,一个正整数 nnn第二至 n+1n+1n+1行,每行n+1n+1n+1个整数,为a1,a2⋯ana_1, a_2 \cdots a_na1,a2⋯an和bbb,代表一组方程。输出格式共nnn行,每行一个数,第iii行为xix_ixi(保留2位小数)如果不存在唯一解,在第一行输出"No Solution".输入输出样例输入 #131 3 4 51 4 7 39 3 2 2输出 #原创 2021-08-07 14:30:18 · 2187 阅读 · 0 评论 -
【洛谷P2054洗牌】AC代码(扩展欧几里得+二分快速幂+二分龟速乘)
题目描述题目链接为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动。由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联提议用扑克牌打发长途旅行中的无聊时间。玩了几局之后,大家觉得单纯玩扑克牌对于像他们这样的高智商人才来说太简单了。有人提出了扑克牌的一种新的玩法。对于扑克牌的一次洗牌是这样定义的,将一叠N(N为偶数)张扑克牌平均分成上下两叠,取下面一叠的第一张作为新的一叠的第一张,然后取上面一叠的第一张作为新的一叠的第二张,再取下原创 2021-08-07 04:29:21 · 311 阅读 · 1 评论 -
STL详解
STL简介编程的抽象发展:面向过程→\to→基于对象→\to→面向对象→\to→泛型STL(Standard Template Library)是C++标准库的一部分(80%),采用模板(Template)机制来表达泛型。STL容器bitset 位集(位运算)位运算基础(&、|、^、~、>>、<<)位运算概述从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共原创 2021-07-27 07:36:41 · 6605 阅读 · 0 评论 -
【回溯法】工作分配
题目描述有nnn项工作要分配给nnn个人完成,每个人只能从事一项工作,且每项工作只能由一人完成。已知第iii个人完成第jjj项工作的工费是c[i][j]c[i][j]c[i][j]元,那么怎么给每个人分配工作才能使得总工费最小。输入格式一个整数nnn,接下来的nnn行,每行一个100001000010000以内的正整数,其中第i+1i+1i+1行第jjj列的整数 ,表示第iii个人完成第jjj项工作时的工费。输出格式输出一个整数,表示最小的总工费。样例输入36 5 44 3 21 5 2原创 2021-07-13 13:11:23 · 846 阅读 · 0 评论 -
【LZOJ】逛街
【题目描述】 小H正在一个 N 行 M 列的街区上闲逛。大H在某个时刻看见小H在位置 (A,B)(即街区的第 A 行 B 列的路口),恰好 T 秒后,大H又在位置 (X,Y)与小H撞了正着。大H并不知道在这 T 秒内小H是否曾经到过 (X,Y),他能确定的是现在小H在那里。 设 P 为小H在 T 秒内从 (A,B) 走到(X,Y) 所能选择的原创 2021-06-26 23:05:17 · 259 阅读 · 0 评论 -
【C++】大顶堆(最大堆)手工模拟优先队列
@TOC完整代码#include <iostream>#include <algorithm>#define maxsize 101//最大maxsize-1长,0是哨兵,下标1~maxsize-1using namespace std;struct num{ int n; num(){//空参构造 n=0; } ...原创 2020-03-22 18:46:58 · 528 阅读 · 0 评论 -
Windows中VS Code配置原生C/C++调试环境教程
VSC配置C/C++VS Code初步VS Code下载地址VS Code安装教程VS Code的必要插件gcc编译器的安装下载地址配置环境变量测试环境变量C++文件配置创建文件夹test/.vscodelaunch.json(需要修改miDebuggerPath项的值为读者GCC的目录)tasks.json效果图调试部分新建源文件test/test.cpp载入项目配置(即打开项目文件夹)载入成功...原创 2020-03-16 17:56:53 · 369 阅读 · 0 评论 -
【C++】位运算求幂集
幂集前言代码前言不解释了,用二进制位表示存取状态,幂集数量为2n2^n2n,用位运算表示就是1<<n。比如集合{a,b,c},000表示空集,001表示取a,010表示取b。代码#include <stdio.h>char chr[]={'a','b','c'};void putSet(int i){ int j=0; bool pre=fal...原创 2020-03-09 18:38:13 · 955 阅读 · 1 评论 -
【C】KMP算法手工实现
KMP前提代码输出数据后记前提本文采用下标0开始的数组来实现next数组,下标1开始的代码以注释表示。主串:ababcabcacbab模式串:abcac计算所得next数组:-1 0 0 0 1next数组代码:void get_next(int next[],char str[]){ next[0]=-1;//next[1]=0 int i,j; i=0,j...原创 2020-03-08 17:45:49 · 235 阅读 · 0 评论 -
【C++】中序表达式转后续表达式(逆波兰表达式)
文章目录思路代码测试思路用栈暂存运算符,读入数据则输出,读入运算符则判断优先级是否输出。代码#include <iostream>#include <stack>using namespace std;stack<char> stk;int opPri(char s){ switch(s){ case '+':case '-':r...原创 2020-02-26 23:21:36 · 664 阅读 · 0 评论 -
【C++】位排序算法
文章目录简介思路参考代码简介位排序灵感来源于二进制,用二进制数表示数字的存在状态。采用空间换时间的思想,把数据压缩到二进制状态表示,适用于海量去重排序,时间复杂度为O(n)O(n)O(n)。思路以unsigned int类型(下文称uint)为例uint类型在C语言中占用4字节即32比特,可以携带32位信息,那么这32位信息就可以表示32个连续整数的存在状态。若我们需要表示0~31这...原创 2019-12-15 22:18:57 · 459 阅读 · 0 评论 -
【C++】图
主要完成图基本操作的实现,图中顶点的数据类型为char主要完成下面6个操作:以邻接矩阵为存储结构,创建有向图以邻接表为存储结构,创建无向图在图中查找某个顶点的位置以邻接矩阵为存储结构,创建有向网深度遍历图广度遍历图使用迪杰斯特拉算法求图中某个顶点到其它顶点的最短路径#include <iostream>#include <stdlib.h>#inc...原创 2019-12-06 20:47:00 · 1551 阅读 · 5 评论 -
【操作系统】存储器管理实验
文章目录实验目的实验内容实验准备相关理论知识相关系统调用的解释GetProcessMemoryInfoHeapAlloc实验过程源代码实验心得实验目的理解WINDOWS中堆、栈的内存布局通过WNDOWS系统提供的系统调用HeapCreate(), HeapAlloc(), HeapFree()等函数的应用,理解虚拟内存管理技术中的内存分配原理。使用工具软件vmmap查看某个进程的虚拟地址空...原创 2019-12-06 20:45:07 · 2166 阅读 · 0 评论 -
【C++】顺序表的排序
#include <iostream>#include <stdlib.h>#include <time.h>using namespace std;#define MAXSIZE 20 //顺序表最大长度typedef struct{ int key; //关键字项,关键字类型为整形 char *otherinfo;...原创 2019-12-01 13:45:31 · 3007 阅读 · 0 评论 -
【C++】二叉排序树
本实验完成二叉排序树中基本操作的实现,二叉排序树中的记录关键字类型为int请实现下面三个操作:在二叉排序树中插入一个关键字为e.key的新结点在二叉排序树中,查找关键字为key的结点在二叉排序树中删除p所指结点#include <iostream>using namespace std;//数据元素类型ElemType定义typedef struct{ int ...原创 2019-12-01 13:44:09 · 375 阅读 · 0 评论 -
【C++】栈和队列
顺序栈#include <iostream>#include <stdlib.h>using namespace std;#define MAXSIZE 100 //顺序栈初始化时分配的存储空间长度typedef struct{ char *base; //栈底指针,栈中元素为字符 char *top; //栈顶指针 int stacksi...原创 2019-12-01 13:10:39 · 838 阅读 · 0 评论 -
【C++】线性表实验
文章目录顺序表单链表顺序表顺序表中基本操作的实现,包括初始化顺序表,建表,顺序表的输出、查找、插入及删除操作该实验约定表中的元素类型为整型。请自行在此实验的基础上补充顺序表其它基本操作的实现(例如:ClearList、PutElem、DestroyList、PriorELem、NextElem、GetElem等)#include <iostream>#include <...原创 2019-12-01 13:06:56 · 815 阅读 · 0 评论 -
【操作系统】进程同步实验
文章目录实验目的实验内容实验原理实验准备实现步骤相关函数CreateThreadCreateMutexReleaseMutexCreateSemaphoreReleaseSemaphoreWaitForSingleObjectSleep实验过程源代码实验心得实验目的分析进程的同步与互斥现象,编程实现经典的进程同步问题——生产者与消费者问题的模拟,进一步加深对进程同步与互斥的理解。实验内容用...原创 2019-11-29 20:11:18 · 12758 阅读 · 2 评论 -
变参函数的相关介绍
文章目录前言前言在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变数目的参数。简单来说,就是函数的参数个数可变,参数类型不定的函数。...原创 2019-11-22 13:33:59 · 276 阅读 · 0 评论