《Programming Challenges》
文章平均质量分 68
第1章到第11章的题目,这些题目可能在面试题中遇到
RayoNicks
这个作者很懒,什么都没留下…
展开
-
Programming Challenges 习题11.6.8
PC/UVa:111008/10201Adventures in Moving - Part IV经过8道动态规划的洗礼,这道题已经算很简单的了,这样Programming Challenges上所有适合我的题目都已经搞定了。为了方便从滑铁卢(武汉武昌武汉大学)搬到一座大城市(武汉东西湖区临空港),我需要从搬家公司租一辆车。但是最近的油价太贵了,我想知道这辆车会花掉我多少油钱。这辆车一公里耗...原创 2019-11-21 11:23:01 · 267 阅读 · 1 评论 -
Programming Challenges 习题11.6.6
PC/UVa:111106/10261Ferry Loading#include <iostream>#include <vector>#include <string>#include <sstream>#include <array>using namespace std;void printChoice(cons...原创 2019-11-20 20:59:23 · 132 阅读 · 0 评论 -
Programming Challenges 习题11.6.7
分阶段决策的过程很明显了,就是一根一根的选取筷子,但是每一次选取的筷子应该是剩下当中最长的还是最短的呢?既然现在无法确定,那就只能在找递推关系的时候确定 所以直接进行第二步,寻找递推关系。假如现在已经用了i根筷子,那么这i根筷子总共有C(i, 3) * C(i - 3, 3) * C(i - 6, 3) * ……种组合方式,然后我们从中选出一些组合方式,使得总难用度badness最小。现在加入第...原创 2019-11-20 20:05:06 · 137 阅读 · 0 评论 -
Programming Challenges 习题11.6.5
PC/UVa:111105/10003Cutting Sticks原创 2019-11-18 21:01:20 · 122 阅读 · 0 评论 -
Programming Challenges 习题11.6.3
PC/UVa:111103/10154Weights and Measures给出最多5607只乌龟的重量和力量,求可以将乌龟摞多高。每只乌龟所承受的重量(自己的重量和上面所有乌龟的重量)不能超过它的力量。#include <iostream>#include <vector>#include <algorithm>#include <clim...原创 2019-11-17 00:44:40 · 178 阅读 · 0 评论 -
Programming Challenges 习题11.6.4
PC/UVa:111104/116Unidirectional TSP原创 2019-11-16 21:29:33 · 91 阅读 · 0 评论 -
Programming Challenges 习题11.6.2
PC/UVa:111102/10069Distinct Subsequences题目中给了两个字符串X和Z,求X中等于Z的子序列有多少个。深搜的方法就不写了,直接写动态规划。最开始拿到这道题也犯难,光凭眼睛虽然能看出来题目中给的两个测试用例的结果,但是递推的过程不方便心算。按照一贯的思路,还是先看看给定一些短的,网上加字符能算出来什么东西。就用题目中的测试用例举例,X = babgbag...原创 2019-11-15 23:03:51 · 85 阅读 · 0 评论 -
Programming Challenges 习题11.6.1
PC/UVa:111101/10131Is Bigger Smarter?一道最长上升子序列的题目。#include <iostream>#include <vector>#include <algorithm>using namespace std;struct Elephant{ int weight, IQ; size_t No;...原创 2019-11-15 17:15:34 · 109 阅读 · 0 评论 -
Programming Challenges 习题10.5.6
PC/UVa:111006/10199Tourist Guide这道题比较简单,题目中所描述的摄像头的位置,记为图的割顶(articulation vertex)。我之前只听过割边(cut edge),但是道理是一样的。首先将找出原图中所有的连通分量,然后针对每个连通分量,依次去除该连通分量中的每个顶点,如果图不连通则为所求。#include <iostream>#includ...原创 2019-11-14 21:16:22 · 87 阅读 · 0 评论 -
Programming Challenges 习题10.5.5
PC/UVa:111005/10158War爸爸的爸爸是爷爷,妈妈的妈妈是姥姥。。。。。。一共N个人,每组输入代表将x和y设置为朋友,或者设置为敌人,或者查询是否为朋友、或者查询是否为敌人。根据题目中提供的二元关系定义,朋友关系是等价关系:朋友是自反的,自己是自己的朋友朋友是对称的,朋友是相互的朋友是传递的,朋友的朋友是朋友敌人关系满足对称性和反自反性:敌人是对称的,敌人是...原创 2019-11-14 12:05:49 · 91 阅读 · 0 评论 -
Programming Challenges 习题10.5.4
PC/UVa:111004/10039Railroads据说这题可以用动态规划来解,不过书上给的提示是最短路径。可以首先使用Dijkstra求出发城市到目的城市的最早到达时间,然后再将图中的边反向(即火车从到达时间开出,在开出时间到达),再次使用Dijkstra求最短路,查找回到出发城市最短时间,即最晚出发时间。还有这题的输入不太好理解,每一趟列车是可以停靠多个车站的,而不是只有始发站和终点...原创 2019-11-12 21:23:08 · 103 阅读 · 0 评论 -
Programming Challenges 习题10.5.3
PC/UVa:111003/10278Fire Station一道找三重最值的题。题目中所描述的最缺少服务的路口,即为距最近消防站的距离在所有路口中最远的那个路口,建立新的消防站后,要让这个值最小。首先求出每个路口距离所有消防站的距离,然后在这些距离中找最小的,即为最近消防站的距离在此基础上,求出最缺少服务的路口,即上述距离中的最大值最后尝试在每个路口建立消防站,使得第二个最值最小...原创 2019-11-11 20:28:07 · 85 阅读 · 0 评论 -
Programming Challenges 习题10.5.2
PC/UVa:111002/10054The Necklace如果是把每个珠子看成顶点,珠子和珠子之间的连接关系看成边,则这是一个汉密尔顿回路问题。书上说当图特别大时,只能搜索来解。这道题顶点数目最多1000个,所以应该另外建模。既然不能把每个珠子作为一个顶点,那么可以把相邻的珠子同一颜色的部分作为一个顶点,珠子两部分的颜色作为边,这样就变成了欧拉回路问题,就可解了。欧拉回路存在的充要条件...原创 2019-11-10 20:34:46 · 73 阅读 · 0 评论 -
Programming Challenges 习题10.5.1
PC/UVa:111001/10034Freckles虽说是浮点数的题目,但是也做了。这道题就是求最小生成树,使用书中介绍的Prim算法,将点依次加入到最小生成树中。根据书上的算法,保存每一个树外节点到最小生成树内节点的最短距离。每次从该最小距离中选择一个点加入最小生成树。如果剩余点到这个点的距离小于已有的值,则更新。首先在最小生成树中加入点0,初始化距离数组为其余各点到点0的范围。#...原创 2019-11-10 15:50:31 · 81 阅读 · 0 评论 -
Programming Challenges 习题9.6.8
PC/UVa:110908/10276Hanoi Tower Troubles Again!这是一个模拟题,可以依次模拟到第51根柱子,然后查表就行了。对于每一个球,如果不能放在其它球的上面,那么就要放在一个新的柱子上,并且后续球放在其它球上时,相加所得的平方数的平方根加1。#include <iostream>#include <vector>#define...原创 2019-11-10 15:46:22 · 98 阅读 · 0 评论 -
Programming Challenges 习题9.6.7
PC/UVa:110907/10187From Dusk Till Dawn中文题目有问题,火车路线不是出发时间和到达时间,而是出发时间和旅行时间。输入有几个要注意的点:网上有人说火车出发时间可能会大于24,需要注意对时间进行修正判断火车时间是否满足要求时,要严格使出发时间在18点到6点之间,并且到达时间在出发时间之后(uDebug上有一个例子中,出发时间4,旅行时间15,也就是到达时...原创 2019-11-10 15:40:02 · 86 阅读 · 0 评论 -
Programming Challenges 习题9.6.6
PC/UVa:110906/10051Tower of Cubes典型的分阶段决策问题,可以使用类似最长上升子序列问题.如果只记录当前立方体能达到的最大高度,是不满足无后效性的,因为当前立方体的底面(和下一立方体接触的面)会对后续放在它下面的立方体有影响,所以应该是二维动态规划,保存当前立方体每种底面颜色的最大高度。因为这道题还需要逆推放置方法,以及顶面颜色,所以除了记录高度,还需要上一块...原创 2019-11-10 15:18:14 · 76 阅读 · 0 评论 -
Programming Challenges 习题9.6.5
PC/UVa:110905/10029Edit Step Ladders如果一个单词可以通过增减、删除或者替换一个字母变成另一个单词,则两个单词构成递变(书中的翻译,英文原文是Edit Step)关系。给定一个字典(排好序),求字典中最长的字典序增加的递变序列。第一步要找出哪些单词之间存在字典序的递变关系(构建图),第二步在图中找最长路径。因为做这道题之前看了《数据结构与算法分析——C++...原创 2019-11-08 19:02:32 · 158 阅读 · 1 评论 -
Programming Challenges 习题9.6.4
PC/UVa:110904/705Slash Maze这道题还真挺复杂的。给定一个/和\组成的矩阵,构造出类似图中的妹子(Maze),求环的数目,以及最大环的长度。第一个问题是如何转换为图,第二个问题是找环。经过很久的思考,还是应该将图表示为图中所示方块的样子,并使用邻接表来表示图,因为通过观察可以发现,一个方块最多和两个连通,这样数据结构能小一些。对于w = 6 h = 4的妹子,总...原创 2019-11-08 12:48:50 · 105 阅读 · 0 评论 -
Programming Challenges 习题9.6.3
PC/UVa:110903/10099The Tourist Guide用这道题回顾了一下Dijkstra算法,自己写一遍就知道Dijkstra是贪心算法了(这个贪心也很好想,至少我觉得是),而Floyd是动态规划。当年大二上数据结构的时候好几个小时才把这玩意吭哧出来,现在半小时搞定了,人丑就要多读书啊!这版本写的跟上周搞的A*算法比较类似,有点像带估价函数的广搜。viClose保存不需要...原创 2019-11-06 20:37:15 · 100 阅读 · 0 评论 -
Programming Challenges 习题9.6.2
PC/UVa:110902/10067Playing with Wheels这题挺坑啊,我严格按照题目中描述的输入数据格式处理输入,把每一行先读入,然后再解析每一行的内容,结果就Runtime Error了,最开始以为是标志位开的太大了,后来拿到Ubuntu上试了下,误输入的时候会出现stoul异常,所以改成了全部按int读取,这才AC。C++中的stoul函数中输入的字符串无法转换为时整...原创 2019-11-06 10:42:33 · 116 阅读 · 0 评论 -
Programming Challenges 习题9.6.1
PC/UVa:110901/10004Bicoloring图的双着色问题,一次广搜遍历即可,最后再单独判断相邻的是否同色。#include <iostream>#include <vector>#include <queue>using namespace std;#define RED 'R'#define BLACK 'B'bool ...原创 2019-11-05 19:47:14 · 67 阅读 · 0 评论 -
Programming Challenges 习题8.6.7
PC/UVa:110807/704Colour Hash有两个问题:多种方案时,题目要求输出最小的,但是uDebug上的测试用例输出的并不是最小的uDebug上有转17次的,不考虑的话在UVa上也可以AC写这道题之前,在《算法艺术与信息学竞赛》上看到了这道题,说用双向广搜,所以也就没走弯路去试别的方法。其实这道题用深搜也不合适。对于每一种状态,有4种转法,去掉还原的那一种转法,还剩...原创 2019-11-05 10:39:59 · 110 阅读 · 0 评论 -
Programming Challenges 习题8.6.6
PC/UVa:110806/10001Garden of Eden这题算简单的,但是不能把所有状态遍历一遍,然后变化一次,应该逆推。以87 17 11110100000000000这个输入为例,得到的自动机表示为:i - 1ii + 1new00010011010101101001101011...原创 2019-11-04 15:12:15 · 81 阅读 · 0 评论 -
Programming Challenges 习题8.6.5
PC/UVa:110805/10032Tug of War有N个人拔河,要分成两组,人数最多差1,使得体重尽量接近,输出两组的体重。N的最大值是100,每个人体重最大值450。N的规模可能达到100,书山提示说枚举其中每一组体重子集实在太多了,所以还是应该找找递推的方法。最开始我写了一个递推的版本。如果可以计算出i个人所有组合方式的体重集合,那么对于第i + 1个人,不加入的话则体重集合没...原创 2019-11-03 21:14:02 · 170 阅读 · 0 评论 -
Programming Challenges 习题8.6.2
PC/UVa:110802/1018115-Puzzle Problem一道很难很难的题,写了3天。#include <iostream>#include <vector>#include <string>#include <set>#include <map>#include <queue>#include...原创 2019-11-02 23:57:04 · 126 阅读 · 0 评论 -
Programming Challenges 习题8.6.4
PC/UVa:110804/10160Servicing Stations一家公司要在N个小镇里销售电脑,小镇之间有M条道路。公司决定在某些小镇建立服务站,保证对于任意一个小镇,要么有服务站,要么和它相邻的小镇有服务站。这道题要枚举所有的子集才能找到最小解,书上明确指明了NPC问题,所以只能穷举搜索了,关键是如何剪枝。第一种剪枝方法是从个数小的子集开始枚举,这样肯定能最快得到解。但是这种方...原创 2019-11-02 19:40:02 · 302 阅读 · 1 评论 -
Programming Challenges 习题8.6.3
PC/UVa:110803/10128Queue英文题目不好理解,去网上查了一下,意思就是说N个身高不一样的人排成一列,从左边看可以看到P个人,从右边看可以看到R个人,求总的排列数目。最开始想的是用组合公式,N个人中最高的那个人将队列分成了两部分,左边i个人,从左看可以看见P - 1个人(右边看见多少都行),右边N - 1 - i个人,从右看可以看见R - 1个人(左边看见多少都行),根据乘...原创 2019-11-02 13:04:19 · 125 阅读 · 0 评论 -
Programming Challenges 习题8.6.1
PC/UVa:110801/861Little Bishops动态规划一般都是从1开始递推到n,这样数组大小就需要n + 1,且一般来说0作为一种提前预置的边界条件,所以分配n + 1维的空间正合适。这样写起来后,代码和递推公式就保持了下标一致性,不会有-1的修正,更容易读。我原来都是能用n就不用n + 1。不仅写起来不方便,而且可读性也很差,最主要的是调试也很麻烦,所以:动态规划千万别装...原创 2019-10-29 22:08:32 · 126 阅读 · 0 评论 -
Programming Challenges 习题7.6.3
PC/UVa:110703/10104Euclid Problem先做了7.6.7题,所以这道题就很好理解了。因为欧几里得算法中参数a > b,所以算出来的x是正数,y是负数(不知道为什么,反正结果是这个)。x减小lcm(a, b) / a,y减小lcm(a, b) / b,有lcm(a, b) / a < lcm(a, b) / b,x减小的少,y增大的多,绝对值和会增大,所以...原创 2019-10-28 10:02:43 · 131 阅读 · 0 评论 -
Programming Challenges 习题7.6.7
PC/UVa:110707/10090Marbles这道题的数据如果用int或者long可能会溢出,所以要使用long long第1次超时,是因为在把x和y修正为正数时采用的是一次一次变化的方法,而不是一次乘法直接变为整数后面超时,是因为又去一次一次的变化x和y去算最小值,这样算起来非常慢,而没法发现这是一个线性函数,极值就在区间端点上#include <iostream>...原创 2019-10-28 09:31:01 · 150 阅读 · 0 评论 -
Programming Challenges 习题7.6.6
PC/UVa:110706/10042Smith Numbers第一次写完后忘记清空viPF中所有的质因数了,所以很久都算不出来。如果在else中定义就不容易出错了。#include <iostream>#include <vector>#include <string>using namespace std;bool Prime(int n)...原创 2019-10-27 18:47:06 · 114 阅读 · 0 评论 -
Programming Challenges 习题7.6.5
PC/UVa:110705/10168Summation of Four Primes本来想着把所有素数枚举出来,然后去优化那个四重循环,但是枚举小于10 000 000的素数时间太长了。应该根据哥德巴赫猜想做。#include <iostream>using namespace std;bool Prime(int n){ if (n == 2) return t...原创 2019-10-27 18:16:14 · 95 阅读 · 0 评论 -
Programming Challenges 习题7.6.4
PC/UVa:110704/10139Factovisors判断m是否可以整除n!。这题很简单,从n开始和m进行约分,直到m变成1。还有就是特殊情况特殊处理,m为0的测试用例在uDebug上显示可以整除任何值,但是UVa上就是WA,因为这个错了4次;m为1的也要特殊处理,原因在下面。另外这道题让我深深体会到除法是有多慢!如果去掉代码中注释的那两行,并把循环之前相同的检查去掉,以及约分之后相...原创 2019-10-23 09:42:03 · 104 阅读 · 0 评论 -
Programming Challenges 习题7.6.2
PC/UVa:110702/10006Carmichael Numbers一看到这道题就想起当年被1024位RSA支配的恐惧了,算一个明文算几个小时。这题明显说了,对于给定的合数n,如果a ^ n mod n == a对于所有小于n的a成立,那么这个数就是Carmichael数,所以肯定是要从头到尾枚举才能算,能优化的方法就是在模幂运算上。计算a ^ n mod n时,用的是每次平方,最后...原创 2019-10-23 09:13:05 · 147 阅读 · 0 评论 -
Programming Challenges 习题7.6.1
PC/UVa:110701/10110Light, more light可以不用模拟每一次按了哪些灯的开关,因为第1次和第n次的操作使得最后一盏灯恢复到初始状态,所以统计n的因子个数,根据奇偶判断。第一次统计因子个数的时候,先判断除数能不能整除被除数,然后根据除数和商的大小关系增加因子个数,然后就超时了,因为这几乎会试除到n-1。第二次提交改成了先判断除数和商的关系,uDebug上的第一个...原创 2019-10-21 18:22:37 · 101 阅读 · 0 评论 -
Programming Challenges 习题6.6.8
PC/UVa:110608/846Steps这一章的题目是真难啊,不光难想,而且还代码还需要高精度运算。这最后一个算是简单的。为了用最少的步数,那么每一步就要尽可能的大,而步长是递增的,所以前一段就应该一直递增步长,然后到达一个值后再递减步长,这样才能保证第一步和最后一步都是1。根据区间的长度,依次减去2、4、6…直到最后剩下的距离不够了。此时这个距离可能有三种情况:0表示正好走完0 ...原创 2019-10-19 23:51:01 · 90 阅读 · 0 评论 -
Programming Challenges 习题6.6.7
PC/UVa:110607/10049Self-describing Sequence看前边很多题都需要高精度运算就没做,就捡了一个软的柿子捏,结果这个也不软。这个序列还是很好递推的,从3开始最好推,也就是build()函数,但是循环还不到最大上上限的一半就已经要用很长时间了,所以肯定不能这么做。通过观察这个自描述序列,可以发现映射后的值小于映射之前的值,所以可以存储逆映射,而且通过uDe...原创 2019-10-18 20:25:20 · 96 阅读 · 0 评论 -
Programming Challenges 习题6.6.3
PC/UVa:110603/10198Counting给一个输入n,找出有多少种使用1、2、3、4的排列方式,使得和为n。特别的,这里的1和4是相同的,都当做1用,比如1 + 2 + 3 = 6,而4 + 2 + 3 = 6。假如输入是4,则排列方式有13、112、22、1111、121、211、31这么多种,又因为1和4都代表1,所以总的排列方式为2 + 4 + 1 + 16 + 4 + 4...原创 2019-10-15 20:34:42 · 111 阅读 · 0 评论 -
Programming Challenges 习题6.6.1
PC/UVa:110601/10183How Many Fibs?做题之前先查了查,发现没人用那个封闭形式估计,所以只能高精度加法了,uDebug测试用例调试的时候出了2个小问题:加法的时候把数字改成小端序了,比较的时候为了用string内置的<运算符,应该换成大端序比较当数列中的某一项大于a时,也可能会大于b,所以应该先判断,然后再算下一项题目中求a <= fi <...原创 2019-10-14 18:51:17 · 76 阅读 · 0 评论