第七章 - 暴力求解法
文章平均质量分 78
专攻挖掘机炒鸡蛋算法
Hahahahaha!
展开
-
UVa #10603 Fill (例题7-8)
看了书上的解法,自己写了一遍,几乎没遇到什么障碍。不过看Board上面的讨论,觉得细节上需要注意的地方还是挺多的。。纯粹自己写肯定分分钟跪下 1、vis数组只用开两维 看到讨论中大家都是用的三维数组vis[201][201][201],其实有了两杯水的数据,第三杯水可以用总量减去两杯水的量得到,所以不需要维护3维数组 2、解的存储 因为题目说如果取不到d,就要打印出比d小的最大的可原创 2014-12-16 16:45:31 · 899 阅读 · 0 评论 -
UVa #1533 Moving Pegs (习题7-12)
跳棋+黑白棋,模拟大法好 我的码写的挺丑陋的,而且速度也很慢。。摸爬滚打AC了也不想再改进了,想快点进入第八章,dp还在等着我哈哈哈 Run Time: 1.202s #define UVa "7-12.1533.cpp" #include #include #include using namespace std; //Global Variables. Re原创 2015-01-22 14:37:22 · 772 阅读 · 0 评论 -
UVa #1601 The Morning after Halloween (例题7-9)
状态空间搜索。。不过状态数量比较多,很容易TLE 优化的方法: 1、使用邻接表 如果每次都使用“尝试走一步看看行不行”的方法,会重复很多次无用的判断。所以用一个vector来保存每个空地相邻的空地,每次走路就遍历这个vector 2、判重的方法 一开始我用了State类型的map来判重,速度很慢。而将坐标hash为一个整数后,存在一个三维数组里(因为最多有三个ghost)进行判重原创 2015-01-05 11:55:24 · 1847 阅读 · 0 评论 -
UVa #11214 Guarding the Chessboard (习题7-10)
被TLE的阴影笼罩了一周,放一道上周刷的小水题开开心先。。之前有人说UVa的数据比较苛刻,现在有点体会了,不优化就是跪,优化的不够还是跪。另外发现有些题目的Stat是不太准啊,明明很难的题90%多的user solving rate,明明很水的题,比如这道保卫棋盘,却只有27.7%、69.9%。。。 回归正题: 这道保卫棋盘跟八皇后问题如出一辙,所以尝试沿用一下回溯法。在回溯法深度优先原创 2015-01-20 16:47:37 · 1870 阅读 · 0 评论 -
UVa #12569 Planning mobile robot on Tree (EASY Version) (习题7-11)
第一道冲破一周来TLE阴影的题。 树的状态可以分成两部分:1、把机器人当成障碍,看树上哪些位置有东西 2、机器人的位置 比较好的表示状态的方法是一个二维数组,第一维保存树的二进制表达,第二维保存机器人的位置(1-15) 需要非常小心的是数组的大小:状态数量最多为(1 Run Time: 3.225s #define UVa "7-11.12569.cp原创 2015-01-20 18:05:59 · 1251 阅读 · 0 评论 -
Uva #690 Pipeline Scheduling (习题7-5)
原题读起来感觉有一点绕,不过题意很简单:其实就是计算机要重复地做一些相同的任务,每个任务需要一定时间,在这段时间内可能会用到不同的处理器(共有5个处理器)。一个处理器在使用的时候会锁住,其他的任务就不能访问了。只能等到下一个clock cycle再使用这个处理器。 任务使用处理器的pattern就是input,比如 7 X...XX. .X..... ..X.... ...X... .原创 2015-01-13 15:43:12 · 2042 阅读 · 1 评论 -
UVa #11212 Editing a Book (例题7-10)
给定一个由连续整数组成的序列(长度1-9),问最少需要多少次剪切粘贴操作能变成1-n的连续序列 书中给的点拨非常重要: 1、启发函数的选择 2、迭代加深的应用 3、依据“每次剪切粘贴最多只能改变三个数字的位置正确性”来剪枝 另外有几个地方有疑惑: 1、剪切粘贴的操作,我尝试用memcpy替代中间数组,速度却更慢了 2、尝试用memcmp来判断到达目标,没有成功 3、原创 2014-12-24 15:49:56 · 1253 阅读 · 0 评论 -
UVa #140 Bandwidth (例题7-6)
这题理解起来也需要一点时间,其实也是一个枚举排列,只不过这次的限制条件没了,但引入了优化条件:让整个排列的带宽最小。 最简单的做法: 记录一共有多少个字母,然后枚举全排列。对于每个排列,算出带宽,找出最小的排列 改进: 因为没有了限制条件(比如八皇后中的不能相互攻击、例题7-5中的“困难”),解答树似乎需要完全遍历。 但是因为目标要求出最小值,所以任何带宽比当前已经达到的原创 2014-12-15 17:46:16 · 923 阅读 · 0 评论 -
UVa #129 Krypton Factor (例题7-5)
7-4练习了回溯法,这道7-5则是练习了回溯法+八皇后 题意并不是很容易理解,需要多读几遍原文,确保理解无误。 仔细读题后发现这道题是在深度优先枚举字母的排列,并加入了“困难”这一限制条件(类似于八皇后中的皇后不能相互攻击的意义) 先想出最简单的解法: 枚举字母串(书中所介绍的递归排列枚举算法),每次产生一个新串都进行检查。 检查是否“困难”的方法是:外层循环枚举子串长度原创 2014-12-15 16:49:23 · 953 阅读 · 0 评论 -
UVA #725 #11059 #10976 (例题7-1 7-2 7-3)
终于到了第七章暴力求解法,上来三道小题热身。。 UVa #725 Division 例题 7-1 看到这题的数据吓尿了,太惨烈了。题目完全没有数据显示出来的难度,不过中间的小细节还是要像对待难题一样谨慎: 思路:枚举分母,从1234到98765。每次用分母乘以n得到分子的值。一旦得出的分子超过5位数就break 细节: 1、分子分母不能同时只有四位 2、分子为四位时,分母不能有原创 2014-12-10 17:57:23 · 938 阅读 · 0 评论 -
UVa #1373 Power Calculus (例题7-13)
又是IDA*,A*的剪枝依然是效率的保障。 大致思路:从数字1开始,每次用它对所有已经得到的数字进行加/减,然后再用得到的新数字重复这个动作。当加/减的次数超过最大限度时停止,然后回溯。 Run Time: 0.665s #define UVa "LT7-13.1374.cpp" #include #include #include using namespac原创 2015-01-07 13:53:58 · 818 阅读 · 0 评论 -
UVa #208 Firetruck (习题7-1)
题意很简单:给一个结点的邻接表,让按照字典序打印出1号结点到n号结点的全部路径。 先给邻接表排序方便按照字典序打印,之后一个dfs即可。 维护一个结点路径的全局变量,每次到达结点n即可打印 比较奇葩的一点是(书里也说了),每次必须上来就判断一下从1号结点出发是否能到达节点n,否则会TLE(不知道这么设置测试数据的意义在哪里,可能是为了考察选手的解题习惯?以后也应该注意这种预判原创 2015-01-09 17:19:34 · 886 阅读 · 0 评论 -
UVa #225 Golygons (习题7-2)
脑残强迫症数学家进大观园,每次走上一次走的步数+1的时候就要左/右转。规定了谜之数字n之后,最后一次行进的步数必须等于n。还愣头青不会绕障碍(大概是处女座,觉得绕过之后走成的路径不完美),问题:如何正确的回家 因为谜之数字n最多20,根据小学算术1+2+...+20应该等于210,也就是说傻逼数学家一天之内走的路不会超过210,那么想要成功折返的话最多往一个方向走105步(实际应该小于1原创 2015-01-09 17:40:50 · 813 阅读 · 0 评论 -
UVa #818 Cutting Chains (习题7-4)
习题7-3还无辜的WA着,以后有机会再debug出来 这个cutting chains难点完全在理解题意上啊 看到1-2 2-3这种东西,我第一反应是Editing a Book那道题。。导致我理解错误了很久。我以为打开以后就要立刻扣回去,并且最终形态一定要1-2-3-4...-n这样连着才可以,其实打开了之后放在一边不管就好了啊。。另外铁环们只要成串,顺序无所谓的啊 所以其原创 2015-01-09 18:00:26 · 980 阅读 · 0 评论 -
UVa #1343 The Rotation Game (例题7-12)
IDA*,发现这个算法真的很好用,感觉像是结合了bfs步数最少和dfs字典序最小的优点,第一次到达目标就可以输出。启发函数的剪枝也是效果令人惊喜。 另外这道题不需要对转盘的状态进行判重也可以获得很好的效果。 因为8个转轮对应的位置比较没有规律,需要提前将这些位置存在数组中,方便旋转操作和回溯法的归位操作。利用数组来人为储存没有规律的数字是很不错的一个想法,借鉴于目前唯一能找到的原创 2015-01-07 11:36:11 · 1337 阅读 · 0 评论 -
UVa #12325 Zombie's Treasure Chest (例题7-11)
书中的分类枚举法一举克服了普通枚举最大10^9的规模: 第一种宝藏最多n/s1个,所以宝藏1的数量可以从1枚举到n/s1,同时算出宝藏2最多多少个,求出总价值。 宝藏2最多n/s1个,枚举方法同上。 因此如果n/s1比较小,就枚举宝藏1,n/s2比较小就枚举宝藏2 如果n很大而s1 s2很小,则用以下的枚举法: s2个宝藏1和s1个宝藏2体积相等,但价值分别为s2*v1原创 2015-03-12 15:07:39 · 783 阅读 · 0 评论