![](https://img-blog.csdnimg.cn/20190918140145169.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
紫书
紫书题解
_AoSnow_
天道酬勤
展开
-
紫书 例6.10 下落的树叶(The Falling Leaves, UVa 699)
大家好,我是小黄呀 题目传送门 题目大意 题干中将每一个叶子当做一个结点,构造一颗二叉树,并且每个结点拥有一个水平位置,相差为1个单位。要求从左往右输出每个水平位置的所有结点的权值之和。 思路分析 对于这种多行输入,如果题目简单,可以进行边读入边实现,即在读入权值的同时,进行统计并构造二叉树。输出要注意格式 根据题意,可以利用数组来存储权值,将结点的水平位置作为下标。将根结点的位置设置为整个数组的中心,然后左子树将下标-1进行递归构造和统计,右子树将下标+1进行递归构造和统计。 具体代码 #inclu原创 2020-08-22 22:03:30 · 201 阅读 · 0 评论 -
紫书 例6.8 树(Tree,UVa528)
大家好,我是小黄呀 继续紫书修行 VJ题目传送门 题目大意 给一颗点带权的二叉树的中序和后续遍历, 并且每个点的权值各不相同,都是小于10000的正整数,要求找到一个叶子使他到根的路径上的权的和最小。 如果有多解,则叶子本身权值小的优先。 思路分析 由于本题的输入比较特殊,每一行由若干数字组成,代表中序或者后续遍历,因此先构造一个read_list函数将一行中的数字存入到相应的数组中,这里用到了stringstream 流来实现string到int的转换,从而存入数组。有关stringstream的具体原创 2020-08-21 22:47:34 · 139 阅读 · 0 评论 -
紫书 小知识点(一)
大家好,我是小黄呀。 函数与递归 自定义函数和结构体 对复杂的表达式要先进行化简。 谓词命名为“is_XXX” 用floor(sqrt(n)+0.5)对结果进行修正,避免整数误差 函数调用与参数传递 gdb调试器 数组、指针与首地址。 递归 gdb 的 r语言 段错误和栈溢出 gdb中 SIGSEGV信号代表段错误。 在可执行文件中,正文段(Text Segment)用于存储指令,数据段(Data Segment)用于存储已初始化的全局变量,BSS段用于存储未赋值的全局变量所需的空原创 2020-07-10 12:38:51 · 164 阅读 · 0 评论 -
斐波那契数列(Fibonacci)及矩阵快速幂的延伸
大家好,我是小黄呀。 题目 斐波那契数列(Fibonacci):第1,2两个数为1,1。从第三个数开始,该数是其前面两个数之和。 快速幂解法 int ans=1; a=a%c; while(b>0) { if(b%2==1) ans=(ans*a)%c; b=b/2; a=(a*a)%c; } ab mod c=(a mod c)b mod c (ab) mod c=[(a mod c)×(b mod c)mod c ] ab原创 2020-07-10 12:38:39 · 270 阅读 · 0 评论 -
十六进制、十进制、八进制转换问题
大家好,我是小黄呀。 十六进制转十进制 #include<stdio.h> #include<string.h> #include<math.h> int main() { char a[8]; int i; scanf("%s",a); int l=strlen(a);//计算字符串长度 long long ans=0;//注意是不超过8位的正的十六进制数字符串,因此数较大,应设为long long for(i=0;原创 2020-07-10 12:38:13 · 168 阅读 · 0 评论 -
紫书 例6.6 小球下落(Dropping Balls, UVa 679)
大家好,我是小黄呀。 VJ题目传送门 题目大意 给定一颗二叉树,最大深度为D,且所有叶子深度都相同(满二叉树)。所有结点按照层次顺序编号为1,2,3,…2^D-1,并且都有一个开关,初始状态全部关闭。在结点1处放一个小球,每经过一个开关,状态发生改变。当小球到达一结点时,若结点开关关闭,则向左走,否则向右走,直至到达叶子结点。 思路分析 初始思路:利用完全二叉树的性质,对于一个结点k,其左子结点和右子结点的编号分别是2k和2k+1,然后运用数组模拟小球下落,每进过一开关改变状态,并判断走向是左还是右,直原创 2020-07-05 18:00:06 · 180 阅读 · 0 评论 -
紫书 例6.4 破损的键盘(Broken Keyboard, UVa 11988)
大家好,我是小黄呀。 VJ题目传送门 题目大意 你正在专心码字,而电脑上的Home键和End键坏掉了会随机摁下(不知道这两个键的自行百度),用符号"[“代表Home,用符号”]"代表End,来模拟屏幕上的输出。 思路分析 方法一:模拟链表 设输入字符串是s[1~n],则可以用next[i]表示在当前屏幕中s[i]右边的字符编号。 同时,假设字符串s的最前面还有一个虚拟的s[0],然后从s[1]开始存储第一个字符,用next[0]表示第一个字符(也就是屏幕中最左边开始的字符)。 然后再用一个cur表示光原创 2020-07-05 09:20:14 · 141 阅读 · 0 评论 -
紫书 例6-3 矩阵相乘(Matrix Chain Multiplication, UVa 442)
大家好,我是小黄呀。 VJ传送门 题目大意 输入n个矩阵的维度和一些矩阵乘表达式,输出乘法的次数。 例如A是m*n矩阵,B是n*p矩阵,那么AB是m*p矩阵,乘法次数为m*n*p. 思路分析 该题是一个矩阵乘法模拟的题目,类似题目首先要构建一个Matrix结构体,然后定义相关功能的函数,这样方便题目的解答。 具体代码 #include<iostream> #include<stack> #include<iostream> #include<string>原创 2020-07-04 19:10:02 · 212 阅读 · 0 评论 -
紫书 例6-2 铁轨(Rails,ACM/ICPC CERC 1997,UVa 514)
大家好,我是小黄呀。 VJ题目传送门 题目大意 有n节车厢从A方向驶入车站,按照1~n的顺序编号,判断能否按照特定的顺序从B方向驶出。 即从A方向按序入栈,从B出栈,运用逆向思维判断是否符合栈的后进先出原则。 具体代码 #include<cstdio> #include<stack> using namespace std; const int MAXN = 1000 + 10; int n,target[MAXN]; int main() { while(scanf("%d原创 2020-07-04 12:21:55 · 216 阅读 · 1 评论 -
紫书 例6-1 并行程序模拟(Concurrency Simulator,ACM/ICPC World Finals 1991,UVA210)
大家好,我是小黄呀。 OJ题目传送门 题目大意 题目给出n个程序,其中每个程序包含若干条指令,每条指令执行所需时钟周期,给出每个程序拥有的总共时钟周期数,模拟出程序执行的过程,输出相应的信息。 五条指令如下: var = constant:赋值,其中var为单个小写字母表示,初始为0,是全局变量。constant为小于100的非负整数,是常数。 print var:打印 lock:上锁,独占资源。 unlock:解锁 end:程序结束 程序模拟过程中存在两个队列: rq:等待队列,按此队列依次执行原创 2020-07-03 21:23:32 · 251 阅读 · 0 评论