算法竞赛入门经典
算法竞赛入门经典 题解代码
漂流瓶jz
Web前端开发,华东师范大学计算机硕士
展开
-
UVA-818 切断圆环链 题解答案代码 算法竞赛入门经典第二版
首先断开的圆环,是可以链接其他已有的每个连通子图的。方法是对每个环断开再对其它圆环每个尝试连接,试图遍历所有场景找出可以形成一条链的组合。但是这种方法产生了不少重复遍历场景(断开的先后顺序不重要),且实际上不需要尝试链接,就能判断是否组成一条链,因此这里时间复杂度太高,大幅超时了。3.1. 首先看每个节点的度,如果度超过2,说明有一个点连接了超过两个点,那肯定需要再断开其他圆环才能形成链,说明这个断开组合不符合要求。2. breakMap函数,将断开的圆环和其它的圆环的链接删掉,组成一个新的图。原创 2024-09-21 23:33:19 · 414 阅读 · 0 评论 -
UVA-211 多米诺效应 题解答案代码 算法竞赛入门经典第二版
又是一道不难的题目。但是输出格式(空行)比较特别,我对照着uDebug改了才AC。我是用从上到下,从左到右,对每个点尝试每种可能的牌。原创 2024-09-17 19:39:38 · 172 阅读 · 0 评论 -
UVA-225 黄金图形 题解答案代码 算法竞赛入门经典第二版
已经访问过的块不能再次被访问,注意这里限制的是每次移动的起点和终点,中间路过已访问过的块是可以的。然后输入中哪些的阻碍的块是不能穿过的,即使移动起点和终点不在阻碍块上,只是中间路过也不行。一道不难的题目,即使不用什么剪枝方法,也不会超时,可以AC的。首先要根据字典序输出,即'e', 'n', 's', 'w'所以实际上是有两种逻辑不同的限制块类型。原创 2024-09-17 00:14:49 · 267 阅读 · 0 评论 -
UVA-208 消防车 题解答案代码 算法竞赛入门经典第二版
这里有同学会问,遍历连通图也用的是DFS呀,为啥不会超时?因为我们要记录路径,所以DFS函数退出时要设置重新设置点为未访问过。但是连通图并不需要。所以连通图要快很多。另外题目的输出样例不对。看起来是%4d或者\t,但实际上就是普通的单个空格,甚至最前面不用空。直接用DFS遍历会超时。要先遍历一遍连通图,看看1和终点是否联通。一道不难的DFS题目。原创 2024-09-07 21:06:05 · 247 阅读 · 0 评论 -
UVA-1603 破坏正方形 题解答案代码 算法竞赛入门经典第二版
我又尝试了第一种的搜索对象是正方形的方法,一开始没有用迭代加深搜索,发现时间超级长。后来使用迭代加深搜索之后,直接AC了。AC代码可以优化的空间还很大,目前剪枝的方法都没用到。原创 2024-08-17 23:36:42 · 190 阅读 · 0 评论 -
UVA-1602 网格动物 题解答案代码 算法竞赛入门经典第二版
使用dfs遍历所有情况,再去重即可。原创 2023-10-05 21:58:14 · 190 阅读 · 0 评论 -
UVA-1374 旋转游戏 题解答案代码 算法竞赛入门经典第二版
但是如果想不打表完成题目,那么就需要使用思路中给出的各种优化方案,不然很容易超时。我一开始用set作为存储已存在的数字,但还是超时,后面改成用数组存储AC了。即使超时,因为数据量不大(1000个), 我们也可以直接打表直接返回结果。由于书上给了思路,所以做起来并不难。原创 2023-09-29 15:14:10 · 307 阅读 · 0 评论 -
UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版
2. 使用一个long long类型的数字作为map的key,key表示这种数字在图形中分别的位置,value表示在第几步访问过。5. 乐观估价函数:在中心每个点的值不对的情况下,每个点都至少需要一次移动才能正确。上述的方法是结合使用的,一开始没想到估价函数,一直在剪枝策略中纠结,然后一直超时。(但是我想的剪枝方法不合理,使用了之后是错误的,在最后有给出)1. 对3种数字,每种数字递归遍历一次,这样每次只需要关注一种数字的变化,情况更少。虽然移动的可能性是无限的,但是最多的移动次数也就是十几次。原创 2023-09-17 02:22:24 · 326 阅读 · 0 评论 -
UVA-12325 宝箱 题解答案代码 算法竞赛入门经典第二版
根据书上的方法来做,是比较简单的题目。关键在于知道等体积时的枚举法。不过数据大小可能很大,虽然输入可以用int处理,但是 体积*价值 后,需要long long才存的下。原创 2023-09-09 21:20:48 · 235 阅读 · 0 评论 -
UVA-11212 编辑书稿 题解答案代码 算法竞赛入门经典第二版
那么广度优先搜索也可以剪枝,也可以有启发函数,而且是一样的启发函数。如果使用迭代加深搜索,搜到第n+1次时,会对前n次的计算结果进行重复搜索,效率不高。由于需要练习“迭代加深搜索”,因此我还是用这个方法做的,感兴趣的同学可以试一下广度优先搜索是否合适。我尝试使用了flag记录使用访问过的标志,但是发现这样效率更低。如果剪枝合适,不记录也是可以的。这道题目在书上的“迭代加深搜索”章节出现,即是采用迭代加深搜索的方法来做。数据粘贴的还原的方法我做的比较繁琐,但是比较容易理解,这个还可以优化。原创 2023-09-03 20:26:35 · 213 阅读 · 0 评论 -
UVA-1601 万圣节后的早晨 题解答案代码 算法竞赛入门经典第二版
由于最高只有3,因此我的全排列写的不怎么优雅,直接嵌套循环完成了。注意每个点可以动,也可以不动,因此我们要考虑只有一个点动,两个点动的情况。如果第一个点动了大现已经遍历过,这时候不能放入队列(因为在其他点不动的情况下,这个状态已经遍历过了)。在同一次中,B可以移动到A离开前的位置上,即如果A走了,B可以去A之前的位置。对每个状态遍历时,情况实际上有 3的全排列(值为6),以及每个点移动的可能四种位置: 3!当然因为墙的存在,因此并没有这么多。按照上面的方法做的话,耗时很久,我扣了点细节,最后终于压线AC。原创 2023-08-13 05:51:40 · 282 阅读 · 0 评论 -
UVA-10603 倒水问题 题解答案代码 算法竞赛入门经典第二版
使用广度优先搜索和优先队列,如果找到最小的点则退出。找不到就遍历所有的情况。原创 2023-08-06 17:50:21 · 222 阅读 · 0 评论 -
UVA-1354 天平难题 题解答案代码 算法竞赛入门经典第二版
2. 计算宽度时,左侧的宽度除了【左子树的宽度+绳子左侧的长度】之外,右子树的左子树也可能很宽,超过【左子树的宽度+绳子左侧的长度】。因此,要对【右子树的左子树-绳子右侧的长度】和【左子树的宽度+绳子左侧的长度】进行比较,看看谁更长。我这里每次把当前所有结点列出,然后遍历选取两个组合构成一个新结点,原来的结点剔除,新结点加入。最后只剩一个结点时,就得到二叉树的一种情况。由于数据量较少,所以我这里没有剪枝。注意选取两个结点后也对应着两种,A放在左边B放在右边 和 B放在左边A放在右边。原创 2023-07-30 05:16:01 · 363 阅读 · 0 评论 -
UVA-140 带宽 题解答案代码 算法竞赛入门经典第二版
注意虽然是8最多8个结点,但是 字母不一定是从A-G,有可能出现任意的字母比如Z。因此,按照字典序中间的部分字母是空出来的,没有这个结点。我们在遍历的时候,要记得去除这些结点。在新确定一个结点时,计算该节点与已经确定的节点的距离,如果大于之前已经算出的最小的组合的带宽,那这个组合的带宽一定更大,就不用往下继续计算了。其实输入给出的数据量并不大,最多8个结点,不剪枝的话也就是8!个组合,应该时间也够。把输入的这些结点进行一个全排列,然后找出带宽最少的组合。我的方法并不是最优解(还差的很远)原创 2023-07-29 23:59:08 · 368 阅读 · 0 评论 -
UVA-129 困难的串 题解答案代码 算法竞赛入门经典第二版
所以,对于当前我们要判断的长度为n的串,它的第1到n-1的串中肯定是没有包含连续子串的,此时加了第n个字符,那么我们就只需要判断包含最后这个字符的子串有没有发生重复的情况即可。如果是包含连续子串的序列,那么这个序列后面无论再加多少个字符,都是包含连续子串的,因此不需要再递归了。首先我们按照字典序生成序列,然后判断序列是否包含连续子串。判断第n个不包含连续子串的序列。原创 2023-07-29 17:40:56 · 404 阅读 · 0 评论 -
UVA-524 素数环 题解答案代码 算法竞赛入门经典第二版
由于判断最大不超过31,因此素数的判断直接手写枚举放到代码里即可。使用书上讲的递归枚举的时候回溯即可。原创 2023-07-23 01:34:10 · 343 阅读 · 0 评论 -
UVA-10976 分数拆分 题解答案代码 算法竞赛入门经典第二版
除了书上讲的y k,否则等式不可能成立。原创 2023-07-22 21:31:17 · 263 阅读 · 0 评论 -
UVA-11059 最大乘积 题解答案代码 算法竞赛入门经典第二版
数据量不大, 暴力即可。原创 2023-07-22 20:55:13 · 155 阅读 · 0 评论 -
UVA-725 除法 题解答案代码 算法竞赛入门经典第二版
【代码】UVA-725 除法 题解答案代码 算法竞赛入门经典第二版。原创 2023-07-22 19:47:25 · 137 阅读 · 0 评论 -
UVA-12118 检查员的难题 题解答案代码 算法竞赛入门经典第二版
那么我们可以把他们组成多个连通图,每个连通图用上面的方法组成欧拉回路。最后再把这些联通图连接起来,就成了一整个欧拉道路。这时候的值为:每个连通图的原有道路数+每个联通图中我们增加的道路数+连通图的数量-1。也就是 原有的总道路数+每个联通图中我们增加的道路数+连通图的数量-1。2. 如果这些道路是联通的,但是不能组成欧拉道路。这时候就又组成了欧拉道路,这时候值为原有道路的数量+我们连接的数量。1. 如果这些道路是联通的,而且组成欧拉道路,那么这些道路可以一笔画,即道路的条数就是我们经过道路的次数。原创 2023-07-15 22:52:30 · 293 阅读 · 0 评论 -
UVA-215 电子表格计算器 题解答案代码 算法竞赛入门经典第二版
题目并不难,数据量也不大,一次数据最多是20*10是200个。因此即使最长的嵌套引用关系,也只有200层,我们使用暴力,循环200层,每次算出当前所有引用节点有值的结点,200次以后必然能得出结果。如果无结果的数据,就是产生循环的无解数据了。原创 2023-07-15 17:25:13 · 447 阅读 · 0 评论 -
UVA-810 筛子难题 题解答案代码 算法竞赛入门经典第二版
我的理解是,即使进入的时候方向不一致,只要进入后骰子面的位置一致了,那么它随后进入其他结点的判断条件是一致的,即应该不能重复进入,给与限制。这里注意,由于位置可以重复进入,因此只记录方向是不够的,还必须记录顺序,即第一次经过,第二次经过要进行顺序的区分。2. 根据骰子的两个相邻的面(例如题目给出的正面和顶面),可以确定整个骰子在桌面的每个面的位置。在确定了正面的情况下,一个骰子的顶面可能是正面的四个邻边的每一个。在骰子面关系中的顶面就是实际的顶面时,如果向右移动,此时顶面就是原来的左面。原创 2023-07-09 06:07:06 · 362 阅读 · 0 评论 -
UVA-10410 树重建 题解答案代码 算法竞赛入门经典第二版
因此,当找到结点a为bfs[b] = bfs[a] + 1,且a < b时,即有可能是兄弟结点,也有可能是父节点。我尝试过,如果把这种情况作为父节点,题目给出的样例可以通过,但是提交后是WA。2. 即使子树成功,更大的子树也可能失败,需要再重新按照别的方案构建更小的子树,且方式不同。我们从b开始往前找,找到b的父节点。此时在bfs中,bfs[a] > bfs[b]。此时在bfs中,bfs[b] = bfs[a] + 1,且a < b。设结点a的bfs,dfs位置分别为bfs[a],dfs[a]原创 2023-06-24 01:33:08 · 714 阅读 · 0 评论 -
UVA-246 10-20-30游戏 题解答案代码 算法竞赛入门经典第二版
不过,判断重复时,除了这些队列一致之外,还要有当前移动到的牌堆序号信息,才能保证是循环。但是目前没有判断这个就可以ac了。不清楚究竟是题目的数据中并没有包含这个这种场景,还是不需要保证牌堆序号信息就可以证明循环。一个难点在于判断出现循环。我参考了网上的做法,将8个双端队列作为一个vector,然后放入set中判断是否重复。(vector和deque都直接有判断方法,这样不用自己写了,非常非常方便)一道模拟题目,使用双端队列模拟手上的牌堆和桌面的7个牌堆即可。原创 2023-06-22 23:23:46 · 159 阅读 · 0 评论 -
UVA-127 纸牌游戏 题解答案代码 算法竞赛入门经典第二版
我使用了栈记录每个堆的数量。简单的模拟题目,暴力即可。原创 2023-06-22 19:39:15 · 278 阅读 · 0 评论 -
UVA-806 空间结构 题解答案代码 算法竞赛入门经典第二版
但是高位的值并不会处理,如果之前并没有初始化int,则高位的值是任意的,因此k的值并不等于char类型的值。我的方法是在通过图构建路径时,先递归到单个像素值,再一层一层的通过父级查看各个子级的颜色是否一致,不一致则子级的路径作为输出路径,一致则继续递归到上级处理。一道遍历四叉树的题目,在遍历的同时还要记住路径,做一些额外的操作。如果不是完全了解其中的细节,最好还是按照官方类型使用,否则会像这样出现一些隐藏的问题。这样使用在我本地没有问题,我使用uDebug测试,所有数据都能通过,但是去OJ提交却WA。原创 2023-06-18 18:25:26 · 143 阅读 · 0 评论 -
UVA-804 Petri网模拟 题解答案代码 算法竞赛入门经典第二版
不难的模拟题目,按照要求一次一次遍历执行即可。原创 2023-06-11 01:06:02 · 243 阅读 · 0 评论 -
UVA-12166 修改天平 题解答案代码 算法竞赛入门经典第二版
如果第四层的值为3,映射到根节点的值为24。可以看到,如果结点符合平衡关系,那么映射到根节点的值是相同的。看其他题解发现,我们只需要树中的某个结点值作为基准,其他的所有结点的值相对于它都是确定的,是*2或者/2的关系。例如第三层的一个结点值为2,那么第二层的所有节点值必须为4,第四层的结点值必须为1。因此我存储了每个结点值和它的层级,用一个二重循环遍历所有节点,第一层设置一个基准结点,第二层用每个节点与基准节点比较,看是否符合上述的关系。最后,相同的值数量最多的,就是改动最少的。原创 2023-06-10 22:41:39 · 98 阅读 · 0 评论 -
UVA-1600 巡逻机器人 题解答案代码 算法竞赛入门经典第二版
在普通BFS的基础之上记录下穿过障碍的状态即可。原创 2023-06-10 16:33:05 · 105 阅读 · 0 评论 -
UVA-536 二叉树重建 题解答案代码 算法竞赛入门经典第二版
先用后续遍历和中序遍历构造出二叉树,再后续遍历一次即可。原创 2023-06-03 20:23:28 · 179 阅读 · 0 评论 -
UVA-712 S树 题解答案代码 算法竞赛入门经典第二版
简单的二叉树题目,而且不需要实际构建出树。原创 2023-06-03 18:40:31 · 89 阅读 · 0 评论 -
UVA-673 平衡的括号 题解答案代码 算法竞赛入门经典第二版
很简单的题目,用栈即可。原创 2023-05-27 16:38:56 · 137 阅读 · 0 评论 -
UVA-11853 战场 题解答案代码 算法竞赛入门经典第二版
起始圆选择与顶端有交集的圆,使用dfs遍历,两个圆有交集即是邻接。如果遍历中发现某个圆与低端有交集,那说明上下分割整个图形,无路径。但是我们可以反过来,通过一个起始圆,计算与它直接或者间接有交集的圆,是否上下分割整个图形。在遍历的同时,查看是否有圆与左右两端有交集,如果有,则计算当前的最低位置,作为入口和出口。由于路径是连续数据,无法离散成点,分割的区域也是圆,因此不能直接查找路径。1. 圆与上下左右两端相切,就说明有交集,不需要相交。2. 圆与另一个圆相切并不算有交集,只有严格相交才算。原创 2022-09-04 06:18:15 · 168 阅读 · 0 评论 -
UVA-506 系统依赖 题解答案代码 算法竞赛入门经典第二版
1. 如果一个已经隐式安装的组件又被显式安装,那么是否需要将这个组件的状态变更为显示安装?一开始我以为是我代码遇到某些数据会会出错,找了好久,最后发现是这个问题。2. 题目的样例有一点错误。最后的HTML和TCPIP的卸载顺序反了。3. 有题目没给数据范围,实测10000可以AC。原创 2022-09-04 00:29:00 · 181 阅读 · 0 评论 -
UVA-1599 理想路径 题解答案代码 算法竞赛入门经典第二版
遍历的时候注意减少不必要的遍历情况,比如那些确定不是最短路的路径结点不能再加入队列,队列中也不要有重复的结点。实际上是为了给第二次遍历缩小范围。由于邻接表查找某条路径耗时较多,因此第二次遍历时可以存储下当前最短路径的颜色信息。本题目是在普通最短路的基础上,加上了路径标识(颜色),根据路径标识做进一步筛选。第二次是根据上一次遍历得到的最短路径结果,根据颜色信息筛选出符合要求的最短路。这一次遍历实际上就已经得到了不包含路径标识(颜色信息)的最短路径。题目结点数据量太大,直接用邻接矩阵无法存储,可以使用邻接表。.原创 2022-08-28 19:01:18 · 310 阅读 · 0 评论 -
UVA-1572 自组合 题解答案代码 算法竞赛入门经典第二版
如书中的分析,把方块的边看做点,方块本身看做边,可以得到一个图(这点比较难想到),然后看这个图是不是有环,来确定是否是无限的图形。遍历图要区分方块的入口和出口。从入口进入,根据图找到出口,然后再根据出口匹配的字母(不通过图)找到下一个入口。如果直接使用方块堆砌来构造图,然后判断是否有重复,这个图数量级太大,不容易做。书中提到是有向图,但是我构造图的时候却是无向图。判断是否有环的时候,只能通过入口确定。混淆出入口的区别可能导致误判。注意便遍历的时候注意清空非环入口的状态,否则会导致其他分支的误判。...原创 2022-08-28 01:17:13 · 146 阅读 · 0 评论 -
UVA-12171 雕塑 题解答案代码 算法竞赛入门经典第二版
对于一个方格,起点的格子是包含在方格内的,但是终点的结点对应的格子是不包含在方格内的,因此在构建图的时候,就要表明哪些结点属于方格的终点,这些点不包含在方格内。直接用这么大的图遍历很可能超时,因此参考之前UVA-221 城市正视图 题目,对坐标进行去重和转换,遍历图使用新坐标,计算体积和面积时使用旧坐标。计算体积时,是用整个500 * 500 * 500的体积减去外围空白区域的体积来计算的,因此这时候需要在计算出的新坐标轴中加入0(最小点)和500(最大点),我实际取的值是505。原创 2022-08-23 00:11:15 · 228 阅读 · 0 评论 -
UVA-10562 看图写树 题解答案代码 算法竞赛入门经典第二版
【代码】UVA-10562 看图写树 题解答案代码 算法竞赛入门经典第二版。原创 2022-08-21 13:52:01 · 191 阅读 · 0 评论 -
UVA-10129 单词 题解答案代码 算法竞赛入门经典第二版
非常简单的欧拉回路题目。原创 2022-08-20 19:57:46 · 150 阅读 · 0 评论 -
UVA-10305 给任务排序 题解答案代码 算法竞赛入门经典第二版
非常简单的一道拓扑排序题目,甚至不需要判断是否有环。原创 2022-08-20 16:30:24 · 124 阅读 · 0 评论