算法竞赛入门经典 (第二版) 第七章 暴力求解法
wcr1996
个人博客:wcr1996.com
展开
-
UVa 725 - Division
水#include#include#includeusing namespace std;setnum[7];int n,cnt,x,y[7];bool z;void judge(){ x=n*y[1]; if(x>98765){ z=true; return; } num[1].insert(x/10000);原创 2014-11-26 21:13:33 · 1375 阅读 · 0 评论 -
UVa 11212 - Editing a Book(IDA*)
给出1到n的一个排列,求最少几次剪切粘贴后使序列升序排列。加深搜索,枚举剪切的起点和终点,再枚举粘贴的切入点。然后当后继数字不正确的值h满足,d*3+h>3*maxd时剪枝。原创 2015-02-28 14:19:19 · 1425 阅读 · 0 评论 -
UVa 12545 - Bits Equalizer(贪心)
给出两个01?串,求通过多少次变换可以让第一个与第二个相同。可进行的变换有把0变成1,把?变成0或1,交换两个字符。使用交换把两串相同的交换没有意义,所以仅对两串有差异的地方进行统计。0可以任意变成1,而0只能通过交换或?产生,所以对第一个串中需要由1变为0的处理就成了关键。首先是用效率最高的交换,然后使用?,如果交换和使用?都无法满足,那么就不能相同。处理完需要由1变为0的之后的就简单了,每处不同最少需要进行一次操作。原创 2015-02-09 21:18:17 · 1641 阅读 · 0 评论 -
UVa 12569 - Planning mobile robot on Tree (EASY Version)(BFS+状态压缩)
有n个结点,一个结点上有机器人,其余结点有的有障碍物,给出结点之间的通路,求最少经过多少步才能让机器人到达目标结点。很像书上八数码的那道例题,使用一个vis数组保存所有状态,然后进行BFS。不同的是,这这道题要进行状态压缩,否则会超时。将每个结点是否为空用一个整数记录,然后用另一个记录机器人的位置,只有(1<<maxn)*maxn数量级的数据,就不会超时了。找到之后递归打印解。原创 2015-02-08 04:36:24 · 2129 阅读 · 0 评论 -
UVa 1374 - Power Calculus(IDA*)
给出一个数,进行加减运算,可以使用中途计算的结果,最少经过多少次可以获得目标值。中途的运算不能出现负数。按照书上说的,每次只去最后生成的数进行运算,当那个数乘2^(maxd-d)小于目标值时,剪枝。PS:提交时可以进行打表。原创 2015-02-08 04:24:01 · 1402 阅读 · 0 评论 -
UVa 307 - Sticks(暴力+剪枝)
给出一些木棍的长度,把这些木棍拼成长度相同的长木棍,求最短的长度。首先对所有木棍进行降序排序,然后开始枚举,枚举下界是小木棍长度的最大值,上界是小木棍长度之和的一半。在枚举的过程中必须进行剪枝,否则会超时。1、当前枚举的长木棍长度不是小木棍长的和的因数时跳过。2、与当前小木棍长度相同的小木棍没有使用,当前小木棍也不会使用。3、当前是拼新的长木棍的第一个小木棍,而最后无法拼成的,直接回溯。4、一根木棍补足长木棍剩余所需长度,而最后无法拼成的,直接回溯。原创 2015-02-08 04:16:27 · 1918 阅读 · 0 评论 -
UVa 12558 - Egyptian Fractions (HARD version)(IDA*)
给出一个真分数,把它分解成最少的埃及分数的和。同时给出了k个数,不能作为分母出现,要求解的最小的分数的分母尽量大。使用IDA*算法解决,在例题求埃及分数的基础上,加上禁用限制就可以了,一开始禁用限制没加好,一直WA。原创 2015-02-08 04:51:06 · 2327 阅读 · 0 评论 -
UVa 817 - According to Bartjens(暴力)
给出一串数字,加上+、-、*使得结果等于2000。数字上限9个,直接进行暴力即可,感觉STL写起来快,居然还过了。反正也挺简单的,就不想再用字符数组重写了,用字符数组应该会快好多。原创 2015-02-08 04:46:54 · 1696 阅读 · 0 评论 -
UVa 225 - Golygons(DFS+回溯)
在一个平面上从原点出发,走n步,第i步走的距离为i,每一步都必须转向90度。有k个障碍物,不能穿过。给出步数和障碍物位置,问有多少种可行路径。输入有负数,但仍然可以使用数组,将g[maxn][maxn]作为原点。(x,y)用g[maxn+x][maxn+y]表示。进行DFS,注意是否有障碍物,当剩下的步数走不回原点时,回溯。原创 2014-12-05 16:00:19 · 1507 阅读 · 0 评论 -
UVa 818 - Cutting Chains(枚举子集+回溯+DFS)
给出环的数量n,之后再给出环的连接状态,问最少打开几个环再重新连接就能使所有环连成一个链条。环的数量很少,用二进制枚举子集,然后逐个判断是否可以连成一条链,如果连成,用解开的数目维护最小值。判断能否连成一条链,首先要使解开后的链条没有三个连在一起的结点,然后链条不能形成环。判断形成环时,DFS判断。若从该结点出发,能回到该结点,则有环。今天在看代码时发现个可以优化的地方,加了个回溯条件。原创 2015-01-26 20:42:51 · 1405 阅读 · 0 评论 -
UVa 129 - Krypton Factor(DFS+回溯)
输出由前L个字母组成的第n个困难的串。困难的串是不包含相邻重复子串的串。用困难的串生成一个串时,仅对其后缀进行判断,看是否是一个困难的串。不是就回溯继续生成。原创 2014-12-04 10:57:12 · 2201 阅读 · 0 评论 -
UVa 140 - Bandwidth(全排列+回溯剪枝)
给出结点和结点之间的连接,求带宽最小的排列。带宽就是在排列中每一个点到其他点最大距离的最大值。首先枚举全排列,使用algorithm中的next_permutation函数。对于每个排列求带宽比较,有一个点的带宽大于当前最小值,就剪掉。这道题不用函数,手动构造能剪更多枝,可以更加省时,但代码可能会长点。原创 2015-01-26 00:57:25 · 1600 阅读 · 0 评论 -
UVa 208 - Firetruck(DFS判连通+回溯)
输入n个结点的无向图和一个结点k,按照字典需输出用结点1到k的所有路径。首先从k开始dfs将所有与之连通的结点标记,若1位被标记则无解。然后从结点1开始dfs,只对和k连通的结点进行。找到之后输出。原创 2014-12-05 00:16:31 · 1427 阅读 · 0 评论 -
UVa 211 - The Domino Effect(枚举+回溯)
多米诺骨牌每骨牌上有两个数,给出7*8的数表,问如何用骨牌布满,输出所有可能解。一共只有28个骨牌,一开始就感觉是暴力的问题。首先预处理骨牌,因为每个骨牌都可以用唯一的数对表示,所以用二维数组g来储存对应骨牌的编号。然后从左上角开始进行枚举,vis储存状态。当存在骨牌冲突时回溯,当右下角也铺上骨牌时输出当前解。PS:貌似lay和dfs能够和在一起写,但是感觉分开代码会短一些。原创 2015-01-27 18:40:11 · 1863 阅读 · 0 评论 -
UVa 12325 - Zombie's Treasure Chest(暴力枚举+预处理)
给出背包大小n,两种宝物的体积s1、s2,两种宝物的价值v1、v2。求能装下的最大价值。首先进行预处理,使n/s1的值尽可能小,满足O(n)的时间不超时。s2的宝物1与s1个宝物2体积相同,所以s=s1*s2的体积只会拿宝物s1或s2中的一种(当s2*v1>s1*v2时,只拿宝物1,反之亦然),这样就把n转化为n%s。然后为了使n/s1尽量小,当s1<s2时,交换s1、s2和v1、v2的值。然后从零开始枚举需要拿的v1的个数,上限是n/s1,因为进行过预处理,所以保证不会超时。求出与处理之后的最大价值。原创 2015-01-31 20:08:14 · 1795 阅读 · 0 评论 -
UVa 10976 - Fractions Again?!
第七章开头水题好多啊。。#include#include#includeusing namespace std;int main(){ int k; while(cin>>k&&k){ vectora[2]; for(int i=k+1;i<=2*k;i++) if(k*i%(i-k)==0){原创 2014-11-26 21:34:28 · 1357 阅读 · 0 评论 -
UVa 11059 - Maximum Product
书上给了思路,水题。#include#includeusing namespace std;const int maxn=20;int a[maxn];int main(){ int n,t=0; while(cin>>n){ for(int i=0;i>a[i]; long long x=0,y; for(int i=原创 2014-11-26 21:33:11 · 1458 阅读 · 0 评论 -
UVa 11214 - Guarding the Chessboard(迭代加深搜索)
给出m*n棋盘上的目标点,求最少用几个皇后可以守卫所有目标点。 类似八皇后做法,2维数组标记行、列、主对角线、副对角线。 有个加速的技巧,测试之后发现10*10的棋盘全部守卫至少需要5个,所以上限就是5,当maxd等于5时直接输出,不进行搜索。原创 2015-03-27 21:51:25 · 1538 阅读 · 0 评论