
程序设计
算法题解分享
yj8023xx
不积跬步无以至千里,不积小流无以成江海
展开
-
判断出栈序列是否合法
题意:已知入栈序列,现给出出栈序列,判断是否合法题目链接:栈的压入、弹出序列核心代码如下:bool IsPopOrder(vector<int> pushV,vector<int> popV) { int n = pushV.size(); stack<int> s; int i, j = 0; for(i = 0; i < n; i++) { s.push(pushV[i]); while(!s.empty() &&am原创 2020-11-19 14:36:42 · 422 阅读 · 0 评论 -
后缀表达式
后缀表达式中缀表达式转换为后缀表达式如果是操作数就压入栈e如果是右括号就将栈op中的数压入e,直到遇到左括号如果是其他操作符就判断优先级,优先级大的压入栈op,优先级小的弹出栈op并压入栈e(考虑顺序和符号优先级)void RPN(){ int i = 0,j = 0,k = 0; while(s[i]) { if(s[i] >= '0' && s[i] <= '9') { // 如果是操作数就直接压入栈原创 2020-07-19 16:03:59 · 753 阅读 · 0 评论 -
洛谷 P3884 二叉树问题(LCA+二叉树深度和宽度)
题目链接:https://www.luogu.com.cn/problem/P3884分析:这道题考察最近公共祖先(转化一下就是最短路径)和二叉树的深度和宽度,可以直接在建树过程中求得。#include<iostream>#include<cstdio>using namespace std;const int N = 1000;int d[N],w[N],f...原创 2020-04-19 16:41:59 · 580 阅读 · 1 评论 -
洛谷【P4305】不重复数字
题目链接:https://www.luogu.com.cn/problem/P4305分析:#include<iostream>#include<cstdio>#include<vector>using namespace std;#define ll long longconst int N = 1e6;const int P = 49993;...原创 2020-04-19 16:34:43 · 469 阅读 · 0 评论 -
洛谷【P1955】程序自动分析(并查集+离散化)
题目链接:https://www.luogu.com.cn/problem/P1955分析:首先看到题目中有两种关系,会想到带权并查集,但发现并不适用,反而有点复杂,其次看了元素的范围之后才发现这道题应该就是普通并查集,难点在于对元素进行离散化,使得元素大小缩小到下标可以表示的范围。#include<iostream>#include<cstdio>#includ...原创 2020-04-14 11:00:08 · 178 阅读 · 0 评论 -
洛谷【P5250】木材仓库
题目链接:https://www.luogu.com.cn/problem/P5250分析:根据题目的描述,可以想到用set集合作为仓库,set提供了很多函数,如count可以返回集合中是否存在某一元素,存在则为1,不存在则为0,lower_bound可以返回集合中第一个大于等于指定元素的元素的下标,upper_bound则返回集合中第一个大于指定元素的元素的下标,erase可以根据下标删除元...原创 2020-04-12 16:09:55 · 565 阅读 · 0 评论 -
洛谷【P1621】集合(并查集)
题目链接:https://www.luogu.com.cn/problem/P1621#include<iostream>#include<cstdio>using namespace std;const int N = 100000 + 10;int f[N],isPrime[N];int find(int x){ return x == f[x] ? x...原创 2020-03-27 15:11:05 · 264 阅读 · 0 评论 -
洛谷【P1629】邮递员送信(正反最短路径)
题目链接:https://www.luogu.com.cn/problem/P1629这道题要求节点1到其他节点的来回的最短路径,又由于道路是单向的,所以不仅要求节点1到其他点的最短路径,还要求其他节点到节点1的最短路径,如果运行n次求最短路径会超时,于是求其他节点到节点1的最短路径时,将矩阵转置,从节点1再求一遍最短路径。#include<iostream>#include&l...原创 2020-03-27 11:38:27 · 342 阅读 · 0 评论 -
FZU【2150】Fire Game(双起点广搜)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2150分析1.首先深搜求出图中共有几个连通块,超过2个就直接输出02.存储所有草的位置,枚举不同的草的起点,双起点广搜求出某个起点到达其他点的最长距离,找到其中最小的。#include<iostream>#include<cstdio>#include<algorith...原创 2020-03-27 11:28:52 · 147 阅读 · 0 评论 -
POJ【3579】Median(二分)
题目链接:http://poj.org/problem?id=3579分析这道题的题意是找到序列中两两差值的绝对值所构成的序列的中位数,我们可以二分最小的差距和最大的差距,假设其中一个差值为x,则如果大于x的差值的数量超过一半,那么x就可能是中位数或者更接近中位数。#include<iostream>#include<cstdio>#include<algo...原创 2019-10-22 19:39:56 · 530 阅读 · 0 评论 -
POJ【2010】Moo University - Financial Aid(优先队列)
题目链接:http://poj.org/problem?id=2010分析从C头奶牛中招收N头。它们分别得分score_i,需要资助学费aid_i。希望新生所需资助不超过F,同时得分中位数最高。求此中位数。这道题既要中位数尽量大,又要受总费用F的约束,一开始实在没有想法,于是看了题解,思路是先对数组a按照分数的从小到大进行排列,然后枚举每一个数作为中位数,并开辟两个数组l和r分别存储比a[i]...原创 2019-10-21 11:24:12 · 132 阅读 · 0 评论 -
POJ【3061】Subsequence(二分加前缀或尺取法)
题目链接:http://poj.org/problem?id=3061分析这道题的题意是给定一个序列和一个值s,求出和不小于s的连续子序列的长度的最小值。这道题可以用二分+前缀,也可以用尺取法。方法一:二分加前缀#include<iostream>#include<cstdio>using namespace std;const int N = 1e5 + 1...原创 2019-10-19 11:28:54 · 186 阅读 · 0 评论 -
POJ【2566】Bound Found(尺取法)
题目链接:http://poj.org/problem?id=2566分析这道题的题意是给定一个序列和一个值t,求一个子区间使得其和的绝对值与t的差值最小,如果存在多个,任意解都可行。这道题可以采用尺取法,但是序列中有正有负,不能满足单调性,因此对序列求前缀和,然后对前缀和进行排序,这样就可以满足单调性。为什么可以对前缀和进行排序?个人理解这里需要记住每个前缀和都是从下标0开始,两个区间肯定存...原创 2019-10-19 10:48:25 · 304 阅读 · 0 评论 -
POJ【2516】Minimum Cost(最小费用流)
题目链接:http://poj.org/problem?id=2516分析这道题考查最小费用流,首先建立源点和汇点,源点指向所有的供应商,边的流量为供应商的供应量,费用为0,商店指向汇点,边的流量为商店的需求量,费用为0,供应商指向商店,流量为无穷大,代表流量没有限制(前提是供过于或等于求),费用为运送商品的费用。注意这道题需要分k次求最大流,这样每一次建边,边的流量就是每种物品的供应量或需求...原创 2019-10-13 10:08:34 · 246 阅读 · 0 评论 -
POJ【3281】Dining(网络流)
题目链接:http://poj.org/problem?id=3281分析这道题的意思是有N头牛,F种食物和D种饮料,每头牛有自己喜欢的食物和饮料且只能选择一种食物和饮料,所有牛不能选择相同的食物和饮料,问最多有多少头牛能得到满足。这道题类似二分匹配,但又不全是,个人理解有点像将二分匹配转化为特殊的网络流的过程。以下是图的模型。增加一个源点s和一个汇点t,将牛拆分成两份,源点指向食物,食物...原创 2019-10-11 09:48:02 · 389 阅读 · 0 评论 -
POJ【3414】Pots(倒水问题+打印路径)
题目链接:http://poj.org/problem?id=3414分析这道题属于倒水问题,思想不变,不过在此之上还需要打印路径,需要在节点当中存储操作o,还需要记录每一个节点的父亲。#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include&l...原创 2019-09-01 10:18:27 · 383 阅读 · 0 评论 -
HDU【1495】非常可乐(倒水问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495分析这道题属于倒水问题,分为两种情况,一个杯子倒满或者一个杯子倒空,用优先队列存储各种状态,按照操作次数从小到大排(小的先出队列),用bfs求最少的操作次数,我参考的是刘汝佳的“倒水问题”,与这道题思想一致,结束条件不同而已。#include<iostream>#include...原创 2019-09-01 10:04:30 · 366 阅读 · 0 评论 -
POJ【3660】Cow Contest(Floyd传递闭包)
题目链接:http://poj.org/problem?id=3660分析这道题题意是给出几头牛之间的关系(哪一头牛比较厉害),且关系具有传递性,求有几头牛的排名是能够确定的。这道题需要使用Floyd求传递闭包,然后把每一头牛能够打败的牛的数量和能够打败这头牛的牛的数量相加,如果数量等于n-1,那么就可以确定这头牛的排名。#include<iostream>#include&l...原创 2019-08-30 13:41:04 · 142 阅读 · 0 评论 -
POJ【3268】Silver Cow Party(正反最短路径)
题目链接:http://poj.org/problem?id=3268分析这道题可以采用两种方式做,第一种思路比较简单,类似Floyd求全源的最短路径,改成SPFA+链式前向星,Dijkstra堆优化应该也可以,第二种采用矩阵转置,两次普通的Dijkstra就可以解决。第一种#include<iostream>#include<cstdio>#include&l...原创 2019-08-28 21:02:06 · 140 阅读 · 0 评论 -
POJ【1797】Heavy Transportation(最大最小值)
题目链接:http://poj.org/problem?id=1797#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;#define INF 0x3f3f3f3fconst int N = 1e3 + 10;in...原创 2019-08-27 21:56:24 · 153 阅读 · 0 评论 -
POJ【2253】Frogger(最小最大值)
题目链接:http://poj.org/problem?id=2253#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<cmath>using namespace std;#define INF 0x3f3f3f3fcons...原创 2019-08-27 21:54:39 · 162 阅读 · 0 评论 -
HDU【2612】Find a way(两次广搜)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2612分析这道题直接两次bfs,累加两次到达KFC的时间,然后遍历找到最短的时间。注意如果时间为0,说明没有到达过。#include<iostream>#include<cstdio>#include<cstring>#include<queue&g...原创 2019-08-26 15:38:34 · 122 阅读 · 0 评论 -
高精度小数
#include<iostream>using namespace std;int main(){ int a,b; cin >> a >> b; int ans = 0; printf("%d.",a / b); a = a % b * 10;//模拟除法的竖式计算 while(ans < 200) {//小数后的200位 cout...原创 2019-08-26 10:48:43 · 273 阅读 · 0 评论 -
POJ 3279 Fliptile(枚举+递推)
题目链接:http://poj.org/problem?id=3279分析这道题我使用深搜的话会超时,所以只能采用枚举。参考刘汝佳训练指南中的“偶数矩阵”这道题,思想是一致的,通过枚举第一行所有数是否翻转的所有情况,下一行所有数是否翻转也就确定,这样保证上一行全为0的情况下,一直推到最后一行,如果最后一行全是0,那么满足条件,直接输出答案。#include<iostream>#...原创 2019-08-25 22:33:38 · 225 阅读 · 0 评论 -
POJ【3278】Catch That Cow(一维广搜)
题目链接:http://poj.org/problem?id=3278分析这道题求的是一维的最短路径,采用bfs,思想与二维的bfs相同。#include<iostream>#include<cstdio>#include<queue>using namespace std;#define INF 0x3f3f3f3f#define P pair...原创 2019-08-25 13:57:37 · 181 阅读 · 0 评论 -
POJ【2251】Dungeon Master(三维广搜)
题目链接:http://poj.org/problem?id=2251分析这道题求的是最短路径,只不过变成了空间的最短路径,思想还是一样。#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int N =...原创 2019-08-24 15:34:20 · 137 阅读 · 0 评论 -
POJ【1321】棋盘问题
题目链接:http://poj.org/problem?id=1321分析这道题跟n皇后问题的思路差不多,只不过棋子的可能小于n个,所以有些行可以不放棋子#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define ll long longint n,...原创 2019-08-24 14:23:05 · 139 阅读 · 0 评论 -
HDU【3089】Josephus again
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3089分析这道题考查了约瑟夫环的递推公式,但题目中的n过大,需要加速递推的过程。讲解链接:https://blog.youkuaiyun.com/Krone_/article/details/83758080#include<iostream>using namespace std;#def...原创 2019-08-22 10:50:32 · 208 阅读 · 0 评论 -
POJ【1012】Joseph
题目链接:http://poj.org/problem?id=1012分析这道题是约瑟夫环的应用,利用公式 p=(p+m-1)%n 求出下一次出环的人的下标,需要注意的是,假设本次出环的人为x,则x之后的人的下标需要-1。从小到大枚举不同的报数值,当存在出环的k个人的下标都大于等于k时(下标从0开始),则该报数值就是答案。假设n = 8,m = 30(n为人数,m为报数值)f(0)=0f...原创 2019-08-22 10:00:43 · 180 阅读 · 0 评论 -
HDU【5643】King's Game
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5643分析这道题是约瑟夫环的应用,只不过报数值不是固定的,而是变化的,因此我们每次改变报数值就好了。关于约瑟夫环,可以参考我之前的文章:https://blog.youkuaiyun.com/qq_43498798/article/details/99829298#include<iostream>...原创 2019-08-21 10:34:06 · 174 阅读 · 0 评论 -
约瑟夫环【递推解法】
讲解连接:https://blog.youkuaiyun.com/wusuopubupt/article/details/18214999求最后一个出环的序号,递推公式如下:f(n) = (f(n - 1) + k) % n = (f(n - 1) + m % n) % n = (f(n - 1) + m) % n#include<iostream>using namespace std;...原创 2019-08-20 11:29:12 · 295 阅读 · 0 评论 -
最大连续子序列的乘积
题目链接:https://vjudge.net/problem/UVA-11059分析这道题求的是最大连续子序列的乘积,因为数据量小,可以采用暴力,下面用另一种方式求解。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define ll long lon...原创 2019-08-18 13:37:28 · 696 阅读 · 0 评论 -
UVA【10129】Play on Words(欧拉回路)
题目链接:https://vjudge.net/problem/UVA-10129分析这道题考查的是欧拉道路和欧拉回路,可以参考刘汝佳的紫书,以下的解法按照的是书上的思路,有不对之处,请多包涵,欢迎指正。#include<iostream>#include<cstring>using namespace std;const int N = 1e5 + 10;i...原创 2019-08-16 15:28:07 · 136 阅读 · 0 评论 -
codevs【1026】逃跑的拉尔夫(bfs+判重)
题目链接:http://codevs.cn/problem/1026/分析这道题在套用一般的最短路径的bfs模版时,还需要加上判重的操作,一般地,每一个节点恰好有一个父亲,但是我们把二位数组增加到三维,在第三维的数组中赋予一定的意义,比如d[x][y][z]表示节点(x,y)在方向z上距离终点的最短距离,假设方向为上下左右,那么节点(x,y)就会有四个父节点,下面的这道题也是类似,不过第三维数...原创 2019-08-15 15:53:58 · 156 阅读 · 0 评论 -
求后序遍历
根据先序遍历(后序遍历)和中序遍历可以唯一确定一棵二叉树,根据先序遍历和后序遍历则不一定。原创 2019-08-11 12:30:27 · 190 阅读 · 0 评论 -
HDU【1512】Monkey King(左偏堆)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1512分析这道题需要合并两个集合,因此可以想到并查集,又需要找到集合中的最大值,可以想到大根堆,问题转化为把两个大根堆合并,所以可以推出左偏堆,一种可并堆。#include<iostream>#include<cstdio>using namespace std;co...原创 2019-08-09 10:49:48 · 165 阅读 · 0 评论 -
POJ【1062】昂贵的聘礼(虚节点+枚举+Dijkstra)
题目链接:http://poj.org/problem?id=1062分析这道题求的是最短路,首先要解决两个问题:1.节点1是最短路的终点,整个过程是一个回溯的过程,我们需要添加一个虚节点来作为最短路的起点,虚节点指向其他各个点的边的权值就是对应物品的价格。2.解决了回溯的问题,就需要解决等级问题,枚举每个点的等级作为最高等级,然后筛选出符合要求的点,最后用Dijkstra求最短路。#i...原创 2019-08-07 16:50:43 · 193 阅读 · 0 评论 -
codevs【1245】最小的N个和
题目链接:http://codevs.cn/problem/1245/分析这道题需要使用小根堆,可以用优先队列来代替。以下是参考大神的做法,博客链接:https://blog.youkuaiyun.com/y20070316/article/details/50526422#include<iostream>#include<cstdio>#include<queue...原创 2019-08-06 11:01:25 · 171 阅读 · 0 评论 -
codevs【1052】地鼠游戏(大根堆)
题目链接:http://codevs.cn/problem/1052/分析这道题考查贪心+大根堆。#include<iostream>#include<cstdio>#include<algorithm>using namespace std;#define N 100 + 10int a[N],cnt;int n;struct Node {...原创 2019-08-04 13:45:54 · 164 阅读 · 0 评论 -
codevs【1063】合并果子(小根堆)
题目链接:http://codevs.cn/problem/1063/分析这道题考查的是堆,我们首先取出两个最小的数,合并然后再加入到堆中,并调整堆结构,因为取的是最小的数,所以采用小根堆,这道题也可以用优先队列来做,下面采用的是手动模拟堆的方式。#include<iostream>#include<cstdio>#include<algorithm>...原创 2019-08-04 11:24:51 · 200 阅读 · 0 评论