加入目录汇总题解
题解
天才夏洛克
这个作者很懒,什么都没留下…
展开
-
例题7-4 UVA524 素数环 Prime Ring Problem
难度:3先用的生成测试法(都是按照书上的思路来的),就是枚举排列,会超时,然后就用回溯法,走不下去的就不去走了,注意递归边界的写法以及回溯的写法,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef ve原创 2021-06-28 17:20:10 · 94 阅读 · 0 评论 -
例题7-3 UVA10976 分数拆分 Fractions Again?!
难度:2给个k,求满足条件的x和y,由题目给的等式和不等式,可以得出y小于等于2k,x大于等于2k,那么k是题目给的,就用k来遍历y,然后看有没有满足条件的x就可以了,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;原创 2021-05-20 17:10:28 · 82 阅读 · 0 评论 -
例题7-2 UVA11059 最大乘积 Maximum Product
难度:2这是暴力题,但是刘汝佳都没有讲,就说可以从两头扫描,就一句话,合着要手推双指针是吧,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef原创 2021-05-20 14:49:23 · 71 阅读 · 0 评论 -
例题7-1 UVA725 除法 Division
难度:2这道题,直接暴力应该也能过,但是看完枚举子集,回过头来,就有了这种思路,就是书上说的,先找第一个被除数,然后再去找有没有满足条件的除数,先枚举个数为5的0到9的子集,然后这个子集枚举出来,用它全排列,构成了第一个数,然后再去找第二个数就行了,总之思路就是先枚举子集然后全排列,代码也不短。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x)原创 2021-05-25 19:37:40 · 92 阅读 · 0 评论 -
习题6-5 UVA1600 巡逻机器人 Patrol Robot
难度:4稍微难一点的bfs,以前数组的bfs都是用二维,来记录这个点入过队没有,但是题目加了一个条件,那就是最多连续穿墙不超过一个数,那么这就又是一维状态,加一维来表示到这个点连续穿墙的次数,也就是题目貌似加了障碍,但这个障碍是一会儿可走一会儿不可走的,不像别的题,要么可走要么不可走,这个一开始你穿过的障碍物少的时候,是可以走的,等穿的墙多了,就变得不可走了,所以就是可能几次走到了同一点,但是穿墙次数不一样,这时属于不同的情况,所以开一维数组来表示这不同的情况。然后需要想明白的很重要的一个点是,当前点的原创 2021-05-20 14:33:09 · 210 阅读 · 0 评论 -
习题6-4 UVA439 骑士的移动 Knight Moves
难度:3先处理输入,然后是bfs即可,我写的是二元到整数的映射,应该也可以写成数组的。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pa原创 2021-05-20 10:21:59 · 142 阅读 · 0 评论 -
习题6-3 UVA536 二叉树重建 Tree Recovery
难度:3由序列重建二叉树。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, int> pa;struct原创 2021-05-18 10:49:11 · 105 阅读 · 0 评论 -
习题6-1 UVA673 平衡的括号 Parentheses Balance
难度:2一看难度是2知道不是很难,用栈比较方便,然后一个需要注意的地方就是,空也为正确,那么输入就可能为空,所以输入的时候要读入一整行。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector&原创 2021-05-20 09:09:44 · 176 阅读 · 0 评论 -
1014 Circles of Friends (35 分)
知识点:图的遍历以前我以为这道题太简单了,今天又看看,确实是比30分的题逼格高那么一些,就是图论的东西想明白就行,首先是连通块的个数,这个比较简单,但是这个遍历和以前的不一样,每个点都要遍历来算它的那个最大值,因为举个例子你会发现,对一个连通块,如果起点不一样,那么相对于它的结果就不一样,题目说的一个连通块的距离应该就是里面所有人的距离的最大值,所以这道题不一样的地方就是要设定两个访问数组,一个是来统计连通块用,全局变量,一直使用,一个是以每个点为起点遍历时用的,仅在当前这次bfs内使用,这个想明白了就行原创 2021-07-15 23:03:42 · 106 阅读 · 0 评论 -
1076 Forwards on Weibo (30 分)
知识点:图的遍历用了邻接表我也不知道为啥变慢了,然后本题比较适合使用bfs,如果用dfs的话比较难,考验你的水平,可以尝试,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long原创 2021-07-15 13:47:52 · 62 阅读 · 0 评论 -
1021 Deepest Root (25 分)
知识点:图的dfs一开始这道题写错了不知道为题出在哪里,后来发现了,是邻接表的两个数组开小了,这两个数组大小是由边的个数决定的,而不是点的个数,这个要想明白,然后就是本题的做法了,先判断是不是一个连通块,然后就是暴力dfs,求以每一个顶点的为根的树的最大深度,最后统计答案输出即可#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.siz原创 2021-07-15 13:20:31 · 66 阅读 · 0 评论 -
例题6-15 UVA10305 给任务排序 Ordering Tasks
难度:3简单拓扑排序,输入m和n的时候要注意。不能直接输入n与m同时不为零,因为可能有几个点但是没有边的情况。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi原创 2021-05-20 11:24:33 · 109 阅读 · 0 评论 -
例题6-14 UVA816 Abbott的复仇 Abbott‘s Revenge
难度:5不得不说刘汝佳的紫书难度曲线太不好了,不到一页讲完bfs,然后就撂给你这么一道例题,然后还说本题非常重要,继续学习之前请先搞懂所有细节。。。建议对bfs不熟练的人先去洛谷上找几道难度为3为4的题先做做,然后洛谷题单里也有一道带方向的难度为3的模拟题,做完这些之后,应该就能不看书自己把这道题啃下来了,然后就是琢磨一下细节问题,对此类问题的理解再加深一下,#include <bits/stdc++.h>#define fi first#define se second#defi原创 2021-05-25 13:48:21 · 167 阅读 · 0 评论 -
例题6-12 UVA572 油田 Oil Deposits
难度:3求数组连通块个数,dfs最基本的应用。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, int> p原创 2021-05-18 14:12:33 · 84 阅读 · 0 评论 -
例题6-11 UVA297 四分树 Quadtrees
难度:4多叉树的dfs,直接按照dfs顺序统计,输入可以早就输入好,然后也可以边输入边统计,一开始做错是因为四个自己点的输入搞错了,搞成了bfs序,实际上是应该是输入一个孩子节点,然后把它解决完,再去输入第二个孩子节点。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace s原创 2021-05-24 12:46:54 · 100 阅读 · 0 评论 -
例题6-10 UVA699 下落的树叶 The Falling Leaves
难度:3用的方法就是建树,然后动态建树的过程中,来统计题目要的数据,虽然写的很冗长,但是没看书自己写的,不像上一题基本上就是照搬。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<原创 2021-05-20 00:04:17 · 128 阅读 · 0 评论 -
例题6-9 UVA839 天平 Not so Mobile
难度:3二叉树的递归输入,以及引用的妙用,这道题还要多看看。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, in原创 2021-05-19 23:15:11 · 73 阅读 · 0 评论 -
例题6-8 UVA548 树 Tree
#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, int> pa;struct node { int原创 2021-05-18 14:52:46 · 94 阅读 · 0 评论 -
UVA127 纸牌游戏 “Accordian“ Patience
难度:3知识点:链表用vector模拟链表,一共两个,一个储存每个牌堆,一个储存非空牌堆的编号,开一个while循环,每次都从前向后遍历,每次只移动一个,移动完就下次while循环从新还是遍历非空牌堆编号,其它的就是模拟了,注意细节含义即可,总结:练习了vector模拟链式结构,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.s原创 2021-07-14 17:45:31 · 91 阅读 · 0 评论 -
UVA12657 移动盒子 Boxes in a Line
这道题用的是双向链表模拟,首先是初始化,我的个人习惯是先建立两个链表节点,然后之后的数据就会在这两个节点之间操作,初始化的时候也将题目数据按照顺序输入,然后说一下比较简单的3操作和4操作,3操作是交换两个节点,每个节点一是有一个数据,也就是题目里面的编号,每个节点还有一个下标,来表示这个节点的地址,如果我们真的执行交换两个节点的操作会很麻烦,不如直接交换两个节点里面的数据,其它的就不用动,然后这两个数据的地址也要交换,这点不能漏,4操作就是来记数,如果是计数器是偶数,那么前一个元素的地址就是pre,也就是原创 2021-07-05 11:49:03 · 99 阅读 · 0 评论 -
例题3-2 UVA10082 WERTYU
常量数组怎么设置#include <bits/stdc++.h>using namespace std;int main() { char str[110] = {"`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"}; char c; while (scanf("%c", &c) == 1) { int i; for (i = 0; i < strlen(str);原创 2021-04-01 15:00:20 · 88 阅读 · 0 评论 -
习题8-1 UVA1149 装箱 Bin Packing
难度:2简单贪心问题,每个包只能装两个东西,问至少需要几个包把东西装完,从大到小排序,然后扫描,可以在线性时间复杂度里面解决这个问题,最后注意特殊情况判断一下#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;type原创 2021-07-01 11:56:40 · 90 阅读 · 0 评论 -
例题8-7 UVA11572 唯一的雪花 Unique Snowflakes
难度:3模型,找一个最长的元素各不相同的连续子序列,这里的思路是进去先给右端点加一,然后进行判断,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;type原创 2021-07-01 11:41:40 · 117 阅读 · 0 评论 -
例题8-11 UVA10954 全部相加 Add All
难度:3霍夫曼编码,优先队列的简单应用#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, int> pa;原创 2021-06-24 14:29:26 · 71 阅读 · 0 评论 -
例题6-2 UVA514 铁轨 Rails
难度:2栈的简单应用#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typedef pair<int, int> pa;int main(原创 2021-05-18 10:47:07 · 120 阅读 · 0 评论 -
例题6-3 UVA442 矩阵链乘 Matrix Chain Multiplication
难度:3题目说格式标准,那么省了很多麻烦,然后需要注意的是,先出栈的是第二个乘数,不要搞反了。#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> vi;typede原创 2021-05-24 11:14:21 · 107 阅读 · 0 评论 -
UVA10410 树重建 Tree Reconstruction
难度:4知识点:多叉树,dfs,bfs题意很简单,根据先序和层序遍历还原二叉树,思路就是遍历先序序列,然后从当前数的前面找它的父亲节点,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).end()using namespace std;typed原创 2021-07-13 19:37:38 · 84 阅读 · 0 评论 -
例题6-6 UVA679 小球下落 Dropping Balls
难度:3基础只是就是完全二叉树的编号,根节点是1,节点是i,那么左子树的编号是2i,右儿子编号2i+1,然后是这道题模拟会超时,可以先从简单情况开始模拟,然后得出结论,第几个到达这个节点的,奇数向左,偶数向右,第几个到达这个节点的计算也要注意,如果是奇数那么要先加再除以2.#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (原创 2021-05-20 08:46:21 · 79 阅读 · 0 评论 -
例题6-7 UVA122 树的层次遍历 Trees on the level
难度:5感觉给个难度5有点高了,这道题的输入有些别扭,但是用string还行,然后难点就在建树,因为点不是按照顺序给出来的,可能你的树深度为5,但是它给的是深度为7的点,也可能不需要到底,要把之前为了建别的点而建的点补充好,所以建树实际上就是四种情况,首先因为个人习惯,先判断是不是到了null,这时分两种情况,操作做完了,这里插入就行,返回,另一种是操作还没有做完,还要接着向下递归,去建树,那么我们这个点还是要分配内存,把这个点建出来,但是没有值,所以赋值-1,表示这个点还没插入值,这是两种情况,另外原创 2021-05-19 18:31:57 · 145 阅读 · 0 评论 -
1119 Pre- and Post-order Traversals (30 分)
先说结论,树里面有只有一个孩子的节点,那么这个二叉树就不能由先序遍历和后序遍历唯一确定,所以中间判断的时候以这个为判断依据,然后是本题的输出,最后要输出一个换行,不然会有格式错误,这是一个很不专业的地方,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).en原创 2021-07-13 01:22:37 · 52 阅读 · 0 评论 -
1151 LCA in a Binary Tree (30 分)
这次的比上个稍微难了一点,没有了二叉搜索树的性质,就是一个二叉树,那么方法就是暴力递归找,当前根节点就是先序序列的第一个数,先看两个数里面有没有等于当前根节点的,有的话就输出,没有的话,如果两个节点的下标在根节点的左右两侧,用中序序列判断,那么当前根节点就是答案,否则判断向左向右递归解决,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x原创 2021-07-12 18:13:35 · 75 阅读 · 0 评论 -
1143 Lowest Common Ancestor (30 分)
第一次遇见的时候觉得眼前一亮的题目,用二叉搜索树的性质来找最近公共祖先,首先两个数不是互相的最近公共祖先,那么它们的最近公共祖先就是这两个数出现之前,大于最小值,小于最大值的值,然后就是其中一个是另外一个的祖先的情况,如果没有找到上述满足条件的数,那么先遍历找到的那个数就是祖先,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size原创 2021-07-12 17:29:44 · 42 阅读 · 0 评论 -
1064 Complete Binary Search Tree (30 分)
这道题的通过率0.59,可见这道题多么的简单,作为一个30分的题,如果二叉树的是一个完全二叉树,那么它的形态已经被确定了,然后又因为二叉搜索树的中序序列的性质,直接往已经确定形状的二叉树里面填数字就可以了,层序遍历以是下标1到n就可以了#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x原创 2021-07-12 17:12:45 · 52 阅读 · 0 评论 -
1053 Path of Equal Weight (30 分)
多叉树的dfs,要求找出所有与给定数据相等的路径,然后按照降序输出,这个题可以直接在dfs的时候输出,做法就是在输入的时候对每个叶子的节点都按照从大到小的顺序排序即可,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).end()using namespa原创 2021-07-12 17:00:39 · 47 阅读 · 0 评论 -
1106 Lowest Price in Supply Chain (25 分)
多叉树的遍历,下标(地址)和自己节点的数据是一样的,就可以用这种比较简单的储存方法,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vec原创 2021-07-12 16:44:06 · 41 阅读 · 0 评论 -
1094 The Largest Generation (25 分)
多叉树的遍历,感觉pat25分的题的难度也就是普及-#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> v原创 2021-07-12 16:32:34 · 41 阅读 · 0 评论 -
1079 Total Sales of Supply Chain (25 分)
多叉树的遍历,pat的题还是用scanf输入比较好,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define sz(x) ((int) x.size())#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef vector<int> v原创 2021-07-12 16:23:14 · 47 阅读 · 0 评论 -
1127 ZigZagging on a Tree (30 分)
蛇形输出层序遍历,这个只要记录每一层的遍历序列,然后输出之前该翻转的翻转一下就可以了,然后看了看自己一年之前提交的,思路真的是一模一样,就是代码风格变了,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef long long ll;typedef原创 2021-07-10 13:51:33 · 59 阅读 · 0 评论 -
1110 Complete Binary Tree (25 分)
判断一棵二叉树是不是完全二叉树,这个感觉用层序遍历比较合适,然后就是层序遍历里面的分类讨论,如果这个节点有右儿子没有左儿子,那么直接返回,同理,直接向下分类讨论,设立了两个标记变量,讨论输出即可#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()using namespace std;typedef l原创 2021-07-10 13:23:46 · 78 阅读 · 0 评论 -
PAT顶级 1026 String of Colorful Beads (35 分)
第一道顶级,这个题目的模型是找一个最大的没有重复元素的区间,然后还有一个第二标尺那就是尽可能价值最大,这个不是很难,最重要是怎么找这个最大的区间要想明白,用的同向扫描的尺取法,这里我的思路就是先移动右边界,然后看右边界的是不是重复出现过了,分成这两种讨论,#include <bits/stdc++.h>#define fi first#define se second#define pb push_back#define all(x) (x).begin(), (x).end()原创 2021-07-01 10:22:47 · 118 阅读 · 0 评论