ACM
化身孤岛的鲸o
我祈祷拥有一颗透明的心灵
展开
-
什么是堆?(堆的介绍)
一、定义堆(英语:heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:(1)堆中某个节点的值总是不大于或不小于其父节点的值;(2)堆总是一棵完全二叉树。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。常见的堆有二叉堆、斐波那契堆等。堆是非线性数据结构,相当于一维数组,有两个直接后继。堆的定义如下:n个元素的...原创 2020-01-07 13:51:25 · 3490 阅读 · 0 评论 -
关于C++字符串以及各种强制转换的一些函数
将字符串转换为字符数组:char ch[10];string s;strcpy(ch,s.c_str());//字符串到字符数组将字符数组转换为字符串:char ch[10];string s;scanf("%s",ch);s=(string)ch;//强制转换为字符串将字符串形式的double型数据转换为double类型double num=atof(s.c_str()...原创 2019-10-13 20:43:38 · 1692 阅读 · 0 评论 -
Dijkstra 邻接链表+优先队列优化
代码如下:#include<iostream>#include<queue>#include<stdio.h>#include<vector>#define INF 0x3f3f3f3f#define MAX 10005using namespace std;int visit[MAX];int dis[MAX];int n...原创 2019-05-05 11:13:10 · 569 阅读 · 0 评论 -
二叉树已知后序,中序转前序输出
思路:后序:左、右、根中序:左、根、右前序:根、左、右后序序列:3, 4, 2, 6, 5, 1中序序列:3, 2, 4, 1, 6, 5后序的最后一个总是根结点,在中序序列中找到该根结点的位置i,则i把中序分为两个部分,左边是左子树,右边是右子树。前序输出要求先打印根结点,再打印左子树,再打印右子树。左子树在后序中的根结点为root – (end – i + 1),即为当前根结点...原创 2019-05-06 19:16:00 · 869 阅读 · 0 评论 -
二叉树已知前序、中序转后序输出
思路:后序:左、右、根中序:左、根、右前序:根、左、右前序序列:1,2,3,4,5,6中序序列:3,2,4,1,6,5前序序列中的第一个结点必定是树的根结点,令这个结点为root,root把这棵树分为了左右两棵子树。i为root所表示的值在中序中的下标,所以i即是分隔中序中对应root结点的左子树和右子树的下标。先打印左子树,后打印右子树,最后输出当前根结点pre[root]的值。...原创 2019-05-06 19:36:04 · 2100 阅读 · 0 评论 -
scanf读入字符串的方法
1、使用cin读入n再scanf读入二维字符数组(每一个都用字符读入)#include<iostream>#include<string>#include<stdio.h>using namespace std;int main(){ int n; cin>>n;//这里如果是scanf("%d",&n),也要用...原创 2019-07-21 16:31:36 · 22449 阅读 · 2 评论 -
最长不下降子序列
什么是最大不下降子序列?给出一系列的数,在这个序列中求一个子序列,这个子序列是递增的(可以相等)。其中最长的子序列就是最长不下降子序列。例如下面的序列:2 2 4 1 5 5 6 3 1 1 5 6最大不下降子序列为:2 2 5 5 6 6其长度为6动态规划(DP)求最大不下降子序列:#include<iostream>#include<math.h>...原创 2019-07-25 22:48:22 · 180 阅读 · 0 评论 -
线性筛素数——埃拉托色尼筛选法
方法一:简单方法这个算法会检查给定整数x能否被2~x-1的整数整除,因此对于单一数据其复杂度为O(x),算法整体的复杂度与xi(i=1,2,3,…,n)的总和成正比。不是很高效。方法二:这个算法比第一个高效了许多。方法三:埃拉托色尼筛选法#include<iostream>#include<math.h>#define MAX 10000005...原创 2019-08-04 18:45:08 · 451 阅读 · 0 评论 -
C语言printf输出格式总结
格式化规定符:%d 十进制有符号整数 %u 十进制无符号整数%f 浮点数%s 字符串%c 单个字符%p 指针的值%e 指数形式的浮点数 %x %X 无符号以十六进制表示的整数%0 无符号以八进制表示的整数 %g 自动选择合适的表示法对于规定符的一些说明:1、对于%d:(1)%md: 指定输出的宽度。数据位数小于m,左端补空格;大于m,按实际位数输出。比如说%3d ...原创 2019-04-17 17:43:56 · 8707 阅读 · 3 评论 -
单源最短路径 Dijkstra path记录路径
代码如下:#include<iostream>#include<stack>#define MAX 10000#define INF 0x3f3f3f3fusing namespace std;int visit[MAX];//访问数组int dis[MAX];//记录最短距离int path[MAX];//记录路径int mp[MAX][MAX];...原创 2019-04-28 13:13:29 · 1054 阅读 · 0 评论 -
洛谷 P3374 树状数组
代码如下:#include<iostream>using namespace std;int n,m;//n个数,操作数为mint a[500005],tree[500005];//初始数组以及树状数组int lowbit(int x){ return x&(-x);}int getsum(int x){ int ans=0; ...原创 2019-08-04 14:24:27 · 106 阅读 · 0 评论 -
洛谷 树状数组1 P3374
代码如下:#include<iostream>using namespace std;int n,m;//n个数,操作数为mint a[500005],tree[500005];//初始数组以及树状数组int lowbit(int x){ return x&(-x);}int getsum(int x){//求1-x的区间和 int a...原创 2019-08-04 12:30:23 · 136 阅读 · 0 评论 -
线段树 洛谷P3372
代码如下://线段树 洛谷P3372#include<iostream>#include<math.h>using namespace std;long long a[100005],n,m;//n为数的个数,m为操作数struct edge{ long long sum;//记录区间和 long long l,r;//左端点和右端点 ...原创 2019-07-26 21:29:38 · 172 阅读 · 0 评论 -
树状数组
什么是树状数组?树状数组 是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。这种数据结构(算法)并没有C++和Java的库支持,需要自己手动实现。树状数组和线段树很像,但能用树状数组解决...原创 2019-08-04 11:46:31 · 126 阅读 · 0 评论 -
洛谷P1135 奇怪的电梯 广度优先搜索
Solution:这道题可以用bfs来做。因为电梯只能向上或者向下走且只能向上或向下走k层,并且题目要求我们求出最少按几次按钮,所以用bfs就可以了。代码如下://bfs#include<iostream>#include<queue>#define MAX 300using namespace std;struct f{ int floor;//当...原创 2019-04-10 14:41:25 · 249 阅读 · 0 评论 -
洛谷P1060 开心的今明 01背包问题(模板)
题目描述Solution:这是一道简单的01背包问题,用到了动态规划的思想。代码如下:#include<iostream>#include<algorithm>using namespace std;int w[30],cost[30],dp[50000];//w数组为重要度,cost数组为money;int n,m;//n是总物品个数,m是总钱数in...原创 2019-04-10 15:13:55 · 286 阅读 · 0 评论 -
洛谷P1443 马的遍历——标准广度优先搜索
Solution:这是一道标准的广度优先搜索题目。我们知道,马在棋盘上是按“日”行走的,也就是有八个方向,我们沿着这八个方向广度优先搜索就可以了。代码如下:#include<iostream>#include<queue>#include<stdio.h>#define MAX 500using namespace std;int mp[MA...原创 2019-04-08 17:35:28 · 467 阅读 · 0 评论 -
洛谷P1192 台阶问题——简单的递推
Solution:这是一道简单的递推题目,每一节台阶都要从前面的台阶上来,因为每次可以上1~k阶台阶,所以我们假设要上第n阶台阶(n>=k),那么就可以从第0~n-k阶台阶上来。于是可以写出递推式steps[n]=steps[n]+steps[n-k]。代码如下:#include<iostream>#define MAX 100005using namespace ...原创 2019-04-08 18:01:06 · 772 阅读 · 1 评论 -
洛谷P1025 数的划分——简单的递推
Solution:这道题主要是递推的思想。题目要求把数n分成k份,我们先考虑特殊情况,显然n<k时,method[n][k]=0; n=k时,method[n][k]=1。剩下的情况:1、分出的k份中含有1:method[n][k]=method[n-1][k-1]2、分出的k份中不含有1:method[n][k]=method[n-1][k-1]+method[n-k...原创 2019-04-08 23:59:40 · 293 阅读 · 0 评论 -
洛谷 P1060 开心的金明 01背包(模板)
Solution:这是一道简单的01背包问题,即每个物品的数量只有一个,每种物品都有两个选择,装入背包或者不装入背包。背包问题用到的基本思想是动态规划。01背包问题的关键在于为什么要逆推?之所以要逆推,这是因为后面的结果要用到前面已经推出来的结果。用逆推就可以不断地更新最大值。代码如下:#include<iostream>#include<algorithm>...原创 2019-04-15 18:21:42 · 206 阅读 · 0 评论 -
洛谷 P1616——疯狂地采药 完全背包问题(模板)
Solution:这是一道完全背包问题。因为每种药物的数量无限,所以我们就不能继续使用解决01背包问题的方法。完全背包需要正推,因为每种物品可以装的数量在0~m/cost[i]之间,所以我们要把j从cost[i]开始,一直递增到m。代码如下:#include<iostream>#include<math.h>#define MAX 100005using n...原创 2019-04-15 18:29:12 · 357 阅读 · 0 评论 -
洛谷 P1216 数字三角形 简单的递推
Solution:这道题的意思让我们从三角形金字塔的最高点开始找到一条到最底端最短的路径。看到这道题,可能很多人都会想从最高点开始用贪心,但是你会发现,用贪心找到的并不是最长的路径。因为贪心只能从现在的点向下取其左右相邻点的最大值,而不能保证取到下一层的最大值,所以不能找到一条最长的路径。所以我们要使用递推,从最底层向上递推。#include<iostream>#inc...原创 2019-04-14 21:01:27 · 357 阅读 · 0 评论 -
洛谷 P1316 丢瓶盖——二分查找
Solution:这是一道标准的考二分查找的题目。重点还是二分的范围,我们先将所有点的位置按从小到大排序。最大的距离应该是0~a[n]-a[1]之间。#include<iostream>#include<algorithm>#define MAX 100005using namespace std;int n,m;int a[MAX];bool judg...原创 2019-04-14 22:36:18 · 495 阅读 · 0 评论 -
洛谷P1057 传球游戏 简单的递推
Solution:这是一道可以用递推来解决的题目。每个人拿到的球可以来自左边的一个人也可以来自右边一个人。于是我们用dp[i][m]表示经过m次传导传到编号为i的人手中。于是可以写出递推式:dp[i][m]=dp[i-1][m-1]+dp[i+1][m-1]当i=1和i=n时,需要特殊处理。边界条件:dp[1][0]=1(经过0次传导的方法数为1)代码如下:#include<...原创 2019-04-10 14:17:42 · 234 阅读 · 0 评论 -
贪心 田忌赛马问题
问题描述田忌和齐王各有n匹马,共有2n组数据,分别给出田忌和齐王n匹马的速度。他们一共要进行n场比赛,若能分出胜负,则输的一方要给赢的一方200银元。若平局,则他们都不用给对方钱。每匹马都只能用一次。现在要你求出一个最佳策略,使田忌获得的钱数最多。并输出这个最大值。Solution:先对田忌和齐王的马的速度的数组进行一次从小到大的排序。step1:我们先比较田忌最快的马和齐王最快的马的速...原创 2019-04-26 11:54:33 · 676 阅读 · 0 评论 -
单源最短路径板子——标准Dijkstra算法+优先队列优化的Dijkstra算法
代码如下:#include<iostream>#define MAX 10005#define WHITE 0#define BLACK 1#define GRAY 2#define INF 0x3f3f3f3fusing namespace std;int n,e;//n为顶点个数,e为边数int m[MAX][MAX];//m为图的邻接矩阵int d[MA...原创 2019-04-15 00:47:15 · 712 阅读 · 2 评论