![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法竞赛入门经典第二版第六章例题+习题
樂_smile
这个作者很懒,什么都没留下…
展开
-
UVa 215 电子表格计算器 (Spreadsheet Calculator)
题目:给定一个表格,类似于EXCEL般计算出各个格子的值,如果至少有一个格子算不出来,则输出所有算不出来的格子的原表达式。要点:这道题乍看是拓扑排序判是否有环,然而。。。实际上由于数据较小,貌似直接模拟就可以了,判断是否有数字格,有的话计算只包含数字格的表达式格,即比如有一个A0格子是 1 A1 = A0 那这个时候A1只包含数字格的表达式 但 A2 = A0 + A2 则不知包含数字格的...原创 2019-08-29 17:29:05 · 297 阅读 · 0 评论 -
UVa 12118 检查员的难题(Inspector's Dilemma)
某国家有V个城市,每两个城市之间都有一条无向路,长度为T,要求寻找一条最短的路,使得该条路经过E条边。无向图的欧拉路径问题;这里先判有多少不连通的路集合。然后每个集合里面利用欧拉路径判断即可。即最多只能有两个点是奇数点。多余的点 / 2 就是需要多走的路径数。#include<bits/stdc++.h>using namespace std;const int max...原创 2019-08-28 23:08:45 · 269 阅读 · 0 评论 -
UVa 810 筛子难题(A Dicey Problem)
题目:走迷宫,筛子头上的那个数字和将要走的位置的数字相同就可以走。给的是头和面对我们的两个数字,根据折叠的那张图。就可以推出来筛子长什么样。要点:一个位置被访问的条件是 在这个点骰子是一样的,即不能只依靠某个点确认是否走过,还要看骰子走到这个点的状态,来确定这个点是否走过额。本题我写的非常麻烦,但是易懂。代码很长,但基本都有注释。#include<bits/stdc++.h...原创 2019-08-28 21:37:16 · 284 阅读 · 0 评论 -
UVa 10410 树重建(Tree Reconstruction)
根据一个bfs序列和一个dfs序列求出所有节点的子节点,不一定是二叉树。优先遍历小的节点。本题主要从dfs开始,根据bfs的相对位置,可以知道是谁的节点。用样例举个例子4 3 5 1 2 8 7 64 3 1 7 2 6 5 8一开始找到 4因为是头节点,加入栈再找到3因为4是头节点,3成为4的子节点 加入栈再找到1因为1和3的位置在bfs里面相距大于1 因此不是兄弟节点,只...原创 2019-08-28 21:31:35 · 349 阅读 · 0 评论 -
UVa 246 10-20-30 游戏(10-20-30)
题目:52张牌叠放在一起,注意,先输入的牌在顶端,然后从上面依次拿出一张从左到右排成一条直线放在桌子上,每张牌代表一个牌堆,然后每次取出手中最上面的一张牌,从左到右依次放在各个牌堆的下面。当往最右边的牌堆放牌后,重新往最左边的牌堆放牌。满足以下三种条件时,可以把牌从牌堆上拿走,并按从上到下的顺序加入手牌,放置于手牌最底端。 例如 从上到下消掉的牌为1 2 3 那么牌堆的底部情况如右 牌 牌...原创 2019-08-28 21:26:02 · 315 阅读 · 0 评论 -
UVa 127 纸牌游戏("Accordian" Patience)
把52张牌从左到右排好,每张牌形成一个牌堆。当某张牌与它左边的那张牌或者左边第三张牌花色相同或点数相同,就把这张牌移动到那张牌系上面。移动后,在观察是否可以发生其他移动,移动卡牌的原则是,越左边的越先移动,如果能移动,优先移动三张的,牌堆有空隙的时候,立刻填补空隙。要点:注意一下没牌把空隙补充,有牌的时候一张一张移动,而不是一堆一堆,因此牌的点数和花色不能直接覆盖,应该用stack存,因为涉...原创 2019-08-27 17:08:05 · 382 阅读 · 0 评论 -
UVa 806 空间结构(Spatial Structures)
题目:输入可能给你两种数据,先输入一个长度,长度为输入数的绝对值如果数为负给出四分数有多少黑色节点,注意黑色节点下不再有分支,每个黑色节点的值为从四分树的顶部走到该节点走过路径的数字排好的五进制转十进制数,例如 若一个黑色节点由四分树的顶部先走 NW 再走 NE 那么值就为 21(越顶部的数字在越后面) (NW ,NE, SW, SE 分别表示1,2,3,4)对应的十进制就为 11。给出的黑...原创 2019-08-27 16:01:08 · 230 阅读 · 0 评论 -
UVa 804 Petri网模拟(Petri Net Simulation)
模拟一下Petri网的变迁。根据输入样例说明 2 1 0 2 -1 2 0 -2 1 0 100 3 3 0 0 3 -1 2 0 -2 -2 3 0 -3 1 0 100 0第一行输入一下有多少个入口(这些入口也可作为中转站的出口)第二行输入一下每个入口起始的token数量第三...原创 2019-08-26 19:26:31 · 277 阅读 · 0 评论 -
UVa 12166 修改天平(Equilibrium Mobile)
给一个深度不超过16的二叉树,代表一个天平。每根杆都悬挂在中间,每个秤砣的重量已知。至少修改多少个秤砣才能平衡呢?要点:你可能会想,每次记录一下天平左边的值和右边的值,不相等的话,需要修改的就加一,但是是不对的,样例一已经给出了提示,那么是否可以存储一下可能保存的值呢,这个想法或许可以实现(有兴趣的可以去实现一下)不过这道题,其实确定一个节点后,天平就是固定了,天平是完全二叉树,知道天平某...原创 2019-08-26 19:19:00 · 203 阅读 · 0 评论 -
UVa 1600 巡逻机器人(Patrol Robot)
机器人要从一个网格的左上角走到右下角,网格中的一些格子是空地,用0表示,障碍物用1表示,机器人每次可以往上下左右走1格,但不能连续的穿过k格障碍,求最短路的长度,起点终点保证是空地。要点;本题乍看非常简单,用bfs求最短路即可,在结构体中带上已经走过的障碍数量,如果走后大于k,那么就舍弃,否则,已经走过的障碍数量++,走后是0,那么置走过的障碍数量为0然而这样的做法不太行,由于要用vis记...原创 2019-08-26 19:13:11 · 279 阅读 · 0 评论 -
UVa 439 骑士的移动(Knight Moves)
输入标准 8 * 8 的国际象棋棋盘上的两个格子,求马最少需要多少步从起点跳到终点。要点:转化一下行的棋盘为数字即可。#include<bits/stdc++.h>using namespace std;const int maxn = 10;int dx[8] = { -1, -2, -1, -2, 1, 2, 1, 2 };int dy[8] = { -2, -...原创 2019-08-26 19:06:59 · 261 阅读 · 0 评论 -
UVa 536 二叉树重建(Tree Recovery)
输入一棵树的先序遍历和中序遍历,输出后序遍历序列。已知中序和后续 推前序,可以看我的另一个文章https://blog.csdn.net/Inuyasha__/article/details/99756631要点:中序遍历是 树的左子树 + 树的根节点 + 树的右子树前序序遍历是 树的根节点 + 树的左子树 + 树的右子树换句话来说,有了前序遍历就有了根,有了根通过中序遍历,就有了左...原创 2019-08-26 19:05:03 · 123 阅读 · 0 评论 -
UVa 712 S树(S-Trees)
给出一棵满二叉树,每一层代表一个0,1变量,取0往左走,取1往右走。给出所有的叶子的值和一些查询,及每个变量的x的取值,求每个查询到达的叶子的值。要点:根据权重,得到所有叶子的值即可。#include<bits/stdc++.h>using namespace std;int main() { //freopen("in.txt", "r", stdin); //...原创 2019-08-26 18:58:10 · 365 阅读 · 0 评论 -
UVa 11853 战场(paintball)
有一个1000 * 1000的战场,战场西南角的坐标为(0,0) 西北角的坐标为(0,1000)。战场有n的敌人,第i个敌人的坐标为(xi,yi) 攻击范围为ri.为了避开敌人的攻击,在任意时刻,你与每个敌人的距离都必须严格大于等于它的攻击范围。你的任务是从战场的西边(x=0 y尽量北,即尽量大进入) 从战场的东边,类似进入的出。要点:从上到下bfs一下 查看是否连通到底,如果连通到底,那就...原创 2019-08-24 18:33:12 · 353 阅读 · 0 评论 -
UVa 506 系统依赖(System Dependencies)
软件组件之间可能会有依赖关系。任务是模拟安装和卸载软件组件的过程。要点:如果install一个软件,那么这个软件是显示安装的,需要的依赖软件称为隐式安装,为什么要这么做呢,当然是为了remove,如果你remove一个软件,你当然希望隐式安装这个软件依赖的软件全部删掉了。而如果你是显示安装的,不是系统帮忙安装的,那就不删掉。其实是很人性化的。觉得本题其实难以理解的点就在于这里。本题数据量没...原创 2019-08-24 17:43:19 · 350 阅读 · 0 评论 -
UVa 1599 理想路径 (Ideal Path)
题目:给一个n个点m条边的无向图,每条边上都涂有一种颜色,用数字表示。求节点1到节点n的一条路径,先保证边数尽量少,再保证经过边的字典序最小。一对节点可能有多对边,一条边可能链接两个相同节点。输入保证节点1可以到达节点n。颜色为 1 - 10^9的整数要点无#include<bits/stdc++.h>#define INF 0x7fffffffusing namespac...原创 2019-08-24 00:17:04 · 242 阅读 · 0 评论 -
UVa 1572 自组合 (Self-Assembly)
题目有n种边上带标号的正方形。每条边要么为一个大写字母后面跟一个加号或者减号,要么为数字00。并且仅当两条边的字母相同且符号相反时,两条边能够拼在一起,00不能和任何包括00的边拼在一起。假设输入的每种正方形都有无穷多个,而且可以旋转和翻转,任务是判断是否能够成一个无限大的结构,每条边要么悬空,要么和上述可拼接的边相邻。要点连接,看看能不能循环一个边,即能不能构成环,判断能不能在有向图里...原创 2019-08-23 13:43:45 · 231 阅读 · 0 评论 -
UVa 12171 雕塑 (Sculpture)
题目:某雕塑由n个边平行于坐标轴的长方体组成。每个长方体用六个整数,x,y,z,x0,y0,z0 表示,均为 1 - 500 的整数,其中x0为长方体的顶点中x坐标的最小值,x表示长方体在x方向的长度。其他同理定义。任务是计算一下这个雕塑的体积和表面积。如果有嵌套现象,即一个长方体完全包裹另一个长方体,不额外算体积。雕塑可能由多个连通快构成。要点有嵌套现象,因此,不能单纯的用体积算出总...原创 2019-08-22 23:08:00 · 302 阅读 · 0 评论 -
UVa 10562 看图写树(Undraw the Trees)
题目:你的任务是将多叉树转化为括号表示法。如下图所示,每个结点除了"-","|",’#‘和空格的其他字符表示,每个非叶结点的正下方总会有一个’|‘字符,然后下方是一排"-"字符,恰好覆盖在所有子节点的上方,单独的一行’#'为数据结束的标记。要点:如何进行递归的写法呢,按题意以及输出样例,发现是深搜,用二位数组。考虑一下只有一个#的情况,空树。#include<bits/stdc...原创 2019-08-22 18:12:23 · 218 阅读 · 0 评论 -
UVa 10129 单词 (Play on Words)
输入n个单词,是否可以把所有这些单词排成一个序列,使得每个单词的第一个字母和上一个单词的最后一个字母相同。每个单词最多包含1000个小写字母。输入中可以有重复的单词即有向边的欧拉路径具体要求:路必须联通(并查集)有一个入度比出度小1的终点,一个出度比入度小1的起点,其余入度均要是偶数,且奇数的点仅为2两个具体关于欧拉回路的知识,可以参考https://blog.csdn.net/...原创 2019-08-22 13:47:38 · 205 阅读 · 0 评论 -
UVa 10305 给任务排序 (Ordering Tasks)
假设有n个变量,还有一个二元组(u,v) 分别表示变量u小于v。那么所有的变量从小到大排列起来是什么样子的呢?例如,有4个变量a,b,c,d 已知 a < b, c < b, d < c 那么可能是 a < d < c < b 也可能是 d < a < c < b,输出任意一种情况即可队列版本,好理解。#include<bits/s...原创 2019-08-22 12:00:25 · 192 阅读 · 0 评论 -
UVa 816 Abbott的复仇 (Abbott's Revenge)
有一个最多包含9*9个交叉点的迷宫。输入起点,离开起点时的朝向和终点,求一条最短路(多解输出任意一个均可)这个迷宫的特殊之处在于,进入一个交叉点的方向(用NEWS这四个字母分别表示北东西南,即上右左下)不同,允许出去的方向也不同。例如, 1 2 WLF NR ER * 表示交叉点(1,2)有三个路标,最后一个字符是结束标志,如果进入该点的方向是W,出去只能是L左转和F前进,其他同理。要点:...原创 2019-08-22 00:07:23 · 282 阅读 · 0 评论 -
UVa 1103 古代象形符号 (Ancient Messages)
每组数据包含一个H行W列的字符矩阵(H<=200, W<=50) 每个字符为4个相邻像素点的十六进制,例如10011100对应的是9c转化为二进制后1表示黑点,0表示白点。输入满足不会出现下述六种符号之外的符号输入至少包含一个符号,且每个像素都属于一个符号每个符号都是一个四连块,并且不同的符号不会相互接触,也不会互相包含如果两个黑像素对角,那么一定有一个元素在这两个元素中间...原创 2019-08-20 21:43:58 · 419 阅读 · 0 评论 -
UVa 572 油田 (Oil Deposits)
输入一个m行n列的字符矩阵,统计字符’@’ 组成多少个八连块。如果两个字符’@'的各自相邻,允许对角线相邻,就说他们属于同一个八连块,输出八连块的数量。要点;已经dfs的八连块给予非*字符,即可,每次dfs一次, 八连块都多一个#include<bits/stdc++.h>using namespace std;const int maxn = 100 + 10;ch...原创 2019-08-20 21:32:59 · 140 阅读 · 0 评论 -
UVa 297 四分树 (Quadtrees)
可以用四分树来表示一个黑白图像,方法是用根节点表示整幅图像,然后把行列各分成两等份,按图中的方式编号,从左到右对应4个子节点。如果某子节点对应的区域全黑或者全白,则直接用一个黑节点或者白节点表示。如果既有黑节点又有白节点,就用一个灰节点表示,并为这个区域递归建树。要点:递归建树至于题目为什么说只序先序遍历就能确定整个树,其实并非四分树都可以这样,而是这道题的四分树比较特殊,每个非叶子节点...原创 2019-08-20 00:20:32 · 175 阅读 · 0 评论 -
UVa 699 下落的树叶 (The Falling Leaves)
给一颗二叉树,每个节点都有一个水平位置:左子节点在它左边1个单位,右子节点在右边一个单位,从左向右输出每个水平位置的所有节点的权值之和。按照递归方式输入,-1表示空树。要点:递归方式输入,用递归方式求解,题目额外说明输出的个数不会超过80个,换句话说,只要开 80 * 2 + 1= 161的数组将树的中心放在中间就不会越界,为了方便,将数组开大一点,当然也可以在递归过程中查看最左的pos和...原创 2019-08-19 21:14:04 · 185 阅读 · 0 评论 -
UVa 839 天平 (Not so Mobile)
输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等就是 W1D1 = W2D2 ,其中 W1 和 W2 分别表示天平左右两边的砝码重量,D为距离。采用递归方式输入,每个天平的格式为 W1, D1, W2, D2 当 W1 || W2 == 0时,表示砝码实际上是一个子天平,接下来会描述这个子天平,当 W1 = W2 = 0时,会先描述左子天平,然后再描述又子天平。要点...原创 2019-08-19 20:37:20 · 179 阅读 · 0 评论 -
UVa 548 树 (Tree)
已知一棵二叉树的中序遍历和后续遍历,求一个叶子使得到根的路径上的权和最小。如果有多解,该叶子本身的权应该尽量小。输入中每两行表示一棵树,其中第一行为中序遍历,第二行为后序遍历。要点:中序遍历是 树的左子树 + 树的根节点 + 树的右子树后序遍历是 树的左子树 + 树的右子树 + 树的根节点换句话来说,有了后序遍历就有了根,有了根通过中序遍历,就有了左右子树,根据长度选出后续遍历的左右子树...原创 2019-08-19 20:04:31 · 140 阅读 · 0 评论 -
UVa 122 树的层次遍历 (Trees on the level)
输入一棵二叉树,你的任务是按从上到下,从左到右的顺序输出各个节点的值。每个节点都按照从跟据点到它的移动顺序给出(L表示左,R表示右)。在输入中,每个节点的左括号和有括号之间没有空格,相邻节点之间用一个空格隔开。每个数的输入用一对空括号“()”结束,这对括号本身不代表一个节点要点:就算在输入过程中,出现了,重复的节点也不应该立即停止后面的输入,应该是以空括号为结尾其他的就是二叉树最基本的遍历...原创 2019-08-18 18:14:27 · 203 阅读 · 0 评论 -
UVa 679 小球下落 (Dropping Balls)
有一颗二叉树,最大深度为D,且所有叶子的深度都相同,所有节点从上到下从左到右编号为,1,2,3,4 …… 2^D - 1 。在节点1处放一个小球,他会往下落。每个内节点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,走后,开关的状态都会改变,如果节点的开关关闭,就往左走,否则往右走,直到走到叶子节点。一些小球从节点1出开始下落,最后一颗小球会落到哪里呢?输入叶子深度和小球个数I,输出...原创 2019-08-18 17:13:38 · 180 阅读 · 0 评论 -
UVa 12657 移动盒子 (Boxes in a Line)
给定N个盒子,从左到右分别标号为1~N;有下面4种操作:“1 X Y” 表示将编号为X的盒子移到编号为Y的左边;“2 X Y” 表示将编号为X移到编号为Y的右边;“3 X Y” 表示交换编号为X和Y的位置;“4” 表示将1~N所有的盒子反序。要你求经过M次操作之后,所有奇数位置的盒子标号之和。有多组数据,第一行两个整数n和m,(n,m <=100000)接下来m个操作,如题目描...原创 2019-08-17 20:19:56 · 303 阅读 · 0 评论 -
UVa 11988 破损的键盘(又名:悲剧文本)(Broken Keyboard)
输入:输入数据有多组。每组数据在一行内包含了至多100000个字母、下划线和两个特别的标点’[‘以及’]’,其中’[‘代表输入到此时"Home"键会被按下。而’]'则代表输入到此时"End"键会被按下。输入数据以EOF作为结束,并且我们保证输入数据的大小不超过5MB。输出:对于每组数据,请在一行之内输出最后他打出的文本是怎样的。要点:1.Home 和 End键不仅打印出两个特别的标点,...原创 2019-08-17 20:09:44 · 233 阅读 · 0 评论 -
UVa 442 矩阵链乘 (Matrix Chain Multiplication)
输入n个矩阵的维度和一些矩阵链乘的表达式,输出乘法的次数,如果乘法无法进行,输入error假定A是 m * n 矩阵 B 是 n * p 矩阵 那么 AB 是 m * p矩阵,相信学过线性代数的都不陌生乘法的次数 为 m * n * p 第一个矩阵的每个数都要和第二个矩阵的 A 矩阵的每一行都要和B矩阵的每一列对应相乘这里的乘法次数是 m * p又A有n行 因此乘法次数...原创 2019-08-10 17:39:13 · 339 阅读 · 0 评论 -
UVa 514 铁轨 (Rails)
某城市有个火车站,铁轨铺设如图所示,n节车厢从A驶入车站,按进入顺序编号为1~n。任务是判断是否能让他们按照某种特定的顺序进入B方向的铁轨并驶出车站,出栈顺序(5,4,3,2,1)是可能的为了重组车厢,可以借助中转站C,这是一个可以停放任意多个车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反顺序驶出C,对于每个车厢,一旦驶入C就不能回到A了,一旦驶入B,就不能回到C了。也就是在任意时刻,只...原创 2019-08-10 17:08:21 · 182 阅读 · 0 评论 -
UVa 210 并行程序模拟 (Concurrency Simulator)
本题需要你模拟一些简单程序,每一个程序有以下5种指令:var = val 给变量赋值,简单起见保证变量名为一个字母,变量为所有进程共用,并且初始为0,保证val是不大于100的正整数;print var 输出变量var;lock 对所有变量申请独占访问 (不影响赋值和打印)unlock 解除独占访问end 结束程序以上指令分别耗时t1,t2,t3,t4,t5的时间,一...原创 2019-08-10 16:43:08 · 212 阅读 · 0 评论