暴力
文章平均质量分 81
AC_Arthur
Die luft der Freiheit weht
展开
-
Codeforces Round #395 (Div. 2) 题解
比赛链接:本次比赛解决3题(好水呀QAQ)A. Taymyr is calling you水题暴力代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #inc原创 2017-02-03 00:48:54 · 854 阅读 · 1 评论 -
Codeforces Round #325 (Div. 2) B. Laurenty and Shop(暴力)
一开始真没反应过来,后来才看到题目里特地黑体字加深了该题的关键:只能通过大道一次。也就是说,在什么地方穿过大道定了之后,那么路线也就定了。 因此我们只要暴力枚举在那个大道路口穿过就行了。细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int max原创 2015-10-13 17:47:14 · 583 阅读 · 0 评论 -
POJ 3414 Pots (BFS)
如果用状态这个术语来表示的话,那么显然,两个杯子中水的情况对应了一个状态。 所以用BFS很容易求出最小值。 该题的打印路径其实和紫书上第6张中迷宫问题用的方法是一样的,用一个父亲指针记录路劲个,这样就可以很方便的打印出路径。细节参见代码:#include#include#include#include#include#include#include#include原创 2015-10-11 19:35:13 · 578 阅读 · 0 评论 -
POJ 3087 Shuffle'm Up(BFS)
很多人不觉得这是个搜索,说是模拟,其实这是没有理解搜索的实质。搜索就是扩充状态和状态的转移。 该题可以将每次洗牌后的情况当成状态进行BFS,只不过这个BFS每次只有一个决策可以拓展罢了,这样当出现状态重复时将无解。那么为什么要用BFS呢? 因为循环结的周期未知,用BFS可以减少递归的无目的性。 而且该题比较简单,每层只有一个拓展点,所以用什么方法倒也无所谓。关于对状态的判原创 2015-10-11 10:54:01 · 903 阅读 · 0 评论 -
FZU 2150 Fire Game (暴搜/ BFS+DFS)
对于该题,显然,如果有两个以上的连通块,那么将无法烧尽所有草地。 所以我们可以先用DFS判断连通块个数,然后枚举两个人防火的地点,进行BFS求最短时间。注意,题目中已经给出了提示:两个人可以选择同一个格子。 我就是在这里WA了好久,因为如果只有一个格子是草地的话,如果不让他们坐标相同,那么将不会进BFS,那么答案将是INF。细节参见代码:#include#include#i原创 2015-10-11 21:44:44 · 649 阅读 · 0 评论 -
HDU 2612 Find a way(BFS)
一开始想法比较傻,对每一个KFC为起点BFS,后来发现其实我们只需要对这两个人为起点BFS一遍就行了,将遇到的每个KFC记录在vector里,但是WA,后来又发现不需要保存的vector里,直接用两个数组记录路径就OK了,成功AC。 之前那个方法肯定也行,不知道哪里出现了BUG。。。细节参见代码:#include#include#include#include#include原创 2015-10-09 17:11:40 · 471 阅读 · 0 评论 -
POJ 3279 Fliptile(暴力)
该题乍看很难,如果要是dfs搜的话恐怕无法快速解决问题。但是仔细分析一下的话,会发现 : 首先,对于每个格子,翻转1次以上是没有意义的,等价于没有反转或反转一次。 所以答案不是1就是0其次,如果对答案进行暴力,再检查该答案是否符合要求,那样枚举的时间复杂度高达2^30,还是无法解决该题。 但是我们发现,对于任意一个格子,对它有贡献的只有它自己和上下左右的格子。 所以我们可以只枚举最上原创 2015-10-10 15:20:08 · 1644 阅读 · 0 评论 -
HDU 1495 非常可乐(BFS)
很简单的BFS,由于一个小小BUG,调了一个晚上~再次接触搜索专题,有了一丝不一样的感觉,再看紫书,才明白其中的一些精华 。其实,搜索和动归简直是密不可分,什么BFS啊DFS啊其实都是搜索,手段都是一样的,目的也是一样的。对于搜索,现在逐渐重视到了一个之前忽视的东西:状态。 其实搜索的就是状态,定义的也是状态,剪枝剪掉的还是状态,记忆化搜索保存的也是状态。对于一个搜索,你会遍原创 2015-10-09 21:36:54 · 663 阅读 · 0 评论 -
POJ 1426 Find The Multiple(dfs)
一开始被m的位数吓到了,以为要用高精度 。 后来发现答案不会超long long,也不知道是数据水了还是本来如此。这样就很简单了, 搜索深度最多19层,每一层只有两个决策: m*10 和m*10+1 。细节参见代码:#include#include#include#include#include#include#includeusing namespace std;t原创 2015-10-06 21:37:58 · 568 阅读 · 0 评论 -
POJ 2251 Dungeon Master(bfs)
简单的BFS模版题。 重新审视BFS和DFS以及DP,发现三者之间存在莫大关联,总的来说,都是对状态的深入理解,以及记录状态再利用,利用状态扩展其他可能状态,以及利用状态剪枝 。 都是对状态的深入理解。细节参见代码:#include#include#include#include#include#include#include#includeusing namesp原创 2015-10-06 19:56:49 · 647 阅读 · 0 评论 -
HDU 2102 A计划 (BFS)
简单BFS,注意好状态转移过程 即可,还有就是一旦踏入传送机,立刻会被传送,所以要立刻改变z坐标细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const in原创 2015-10-13 22:05:52 · 701 阅读 · 0 评论 -
HDU 2181 哈密顿绕行世界问题(水DFS)
该题乍看很难的样子,其实就是个水DFS,因为要打印所有可能方案,所以无法剪枝,直接遍历所有可能情况就行。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;cons原创 2015-10-28 16:11:51 · 731 阅读 · 0 评论 -
Codeforces Round #363 (Div. 2)题解
这场比赛水了4个题。 部分题解如下:A. Launch of ColliderA题:我们每次遇到一个L, 就找到上一个R,他们肯定是比较近的, 这些中最近的就是最近的辣。细节参见代码:#include #include #include #include #include #include #include #include #include #inclu原创 2016-07-20 20:49:59 · 1446 阅读 · 0 评论 -
Manthan, Codefest 16 D. Fibonacci-ish(暴力)
题目链接:点击打开链接题意:给你n个数, 问最长的题目中定义的斐波那契数列。 思路:枚举开始的两个数, 因为最多找90次, 所以可以直接暴力, 用map去重。 注意, 该题卡的时间有点厉害啊, 用了两个map结果超时。细节参见代码:#include#include#include#include#include#include#include#include#in原创 2016-02-28 21:38:13 · 1592 阅读 · 0 评论 -
Codeforces Round #226 (Div. 2) C. Bear and Prime Numbers(暴力)
题目链接:点击打开链接题意:给n个数, m次询问, 每次询问时一个区间[l, r]。 求这个区间中的所有素数,能被n个数中的几个数整除的累加和。思路:没想到什么好办法, 直接筛出素数以后直接暴力的,没想到跑的这么快。。最费时间的大概就是那个二重循环, 但是可能因为素数比较少, 所以实际的时间复杂度并不高。细节参见代码:#include#include#include#in原创 2016-02-02 13:10:04 · 1283 阅读 · 0 评论 -
HDU 5616 Jam's balance(暴力枚举子集)
题目链接:点击打开链接题意:有一个没有游标的天平,和n个秤砣,m个询问, 每次一个k,问可否秤出k这个重量。 秤砣可以放两边。思路:因为n最大20, 暴力枚举子集。 因为可以放两边, 所以每次再跑一遍, 减去每个的重量, 将答案保存。比赛的时候忘了限制边界,虽然过了终测数据, 却被人用大数据hack了(RE), 还是自己程序写的不够鲁棒, 思考的不完善。细节参见代码:#incl原创 2016-01-31 10:29:24 · 1854 阅读 · 1 评论 -
HDU 5613 Baby Ming and Binary image(暴力)
题目链接:点击打开链接题意:给一个矩阵A, 要求找到一个01矩阵使得每个格子以及周围8个格子数字之和等于A中对应的格子。要求第一行和最后一行必须都是0套路题, 因为第一行和最后一行已经确定了,并且n很小, 直接二进制枚举子集枚举第一列的情况,然后就可以一列列递推出后面的所有情况了。细节参见代码:#include#include#include#include#include原创 2016-01-26 15:47:09 · 1557 阅读 · 2 评论 -
HDU 5207 Greatest Greatest Common Divisor(暴力)
和很多题目的思路是一样的, 因为如果直接二重循环枚举的话时间复杂度是承受不了的, 所以我们不妨换个思路, 先预处理出来没个数出现的次数, 然后从1枚举到最大值i, 对于每个i , 我们找它的倍数, 那么它的倍数肯定以它为最大公约数(因为是从大到小枚举的), 如果超过两个, 则存在以i为最大公约数的两个数, 那么这个i也就是最大的。细节参见代码:#include#include#incl原创 2015-12-21 09:14:49 · 770 阅读 · 0 评论 -
Codeforces Round #325 (Div. 2) C. Gennady the Dentist(水题)
直接暴力就行,n^2复杂度可以承受 。比较坑的是该题爆int 。 因为4*10^3*10^6 > 2147...细节参见代码:#includeusing namespace std;typedef long long ll;const int INF = 1000000000;const int maxn = 4000 + 5;int n,m,vis[maxn];vect原创 2015-10-15 20:50:47 · 565 阅读 · 0 评论 -
HDU 1043 Eight(BFS打表+状态去重)
该题是一道经典的八数码问题,难点在于对状态的定义和判断该状态是否访问过。 紫书上列举了三种方法:set存,hash,编码解码。编码解码的原理是利用了康托展开,我们都知道,对于一个长度为n的序列,其全排列一共有n!种,利用康托展开我们可以快速的求出一个排列是按照字典序的第几个排列。这样我们就将每个排列(状态)与一个n!内的整数对应起来了。 但是这样还是会超时,无奈我想到了既然终点状态固定,原创 2015-10-29 14:01:58 · 713 阅读 · 0 评论 -
UVA 11624 Fire! (BFS)
该题是一道比较简单的BFS, 难点在于火会蔓延,那么我们不妨分开进行两次BFS,一次标记好每一处第一次被火烧到的时间,第二次就可以用这个时间标记来进行BFS了。之前也有过一次记录下时间标记来利用的情况 ,算是个技巧吧。细节参见代码:#include#include#include#include#include#include#include#include#inclu原创 2015-10-13 16:09:08 · 538 阅读 · 0 评论 -
POJ 1321 棋盘问题(搜索)
暴力搜索,只要把握住几个地方就行了 :1. 我们可以按照行来放置,因为任意两个棋子不能同行,所以对于每一行,要么放,要么不放。2.我们可以用一个数组记录每一列在此之前有没有棋子,其实就是一个更简单的八皇后问题。这样已经足够通过本题的数据了,但是我们还可以添加一个剪枝:如果当前棋子数+之后的行数 细节参见代码:#include#includeusing namespace s原创 2015-10-06 17:39:01 · 511 阅读 · 0 评论 -
10132 - File Fragmentation
网上很多人用的什么矩阵,没看懂,其实该题n最大75,估算了一下复杂度,直接四重循环枚举矩形的两个对角线顶点暴过去就OK了。 不过一开始WA了是因为该矩形不仅可以行旋转和列旋转,还可以即行旋转又列旋转,不过可以发现,旋转完之后,其实就等于前三种情况剩下的部分。 由于有负数,要注意排除一些答案为0的情况。细节参见代码:#includeusing namespace std;typ原创 2015-09-17 14:52:33 · 553 阅读 · 0 评论 -
变形课(DFS)
水题#include#include#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int mod = 1e9 + 7;const int INF = 1e9;const int maxn =原创 2015-10-20 17:12:07 · 691 阅读 · 0 评论 -
12558 - Egyptian Fractions (HARD version)(IDA*算法)
IDA*算法,迭代加深搜索和A*算法的结合 。迭代加深搜索适用于那些没有明显深度上限的题目,将深度从小到大枚举,直到找到最优解 ,减小了深搜的盲目性 。A*算法需要一个乐观估价函数,在这个函数里寻找一个代价最小的点去搜索,所以时间复杂度都浪费在这个上面了 。其实我照着紫书上巧的,感觉很容易,实际上其中的算法思想是要静下心来仔细研究的,练ACM这么久了,深深感到这个竞赛是那么的迷人,又是原创 2015-08-04 20:04:27 · 717 阅读 · 0 评论 -
225 - Golygons(暴力搜索)
直接暴力搜索,一开始我用map保存的障碍点,但是超时了 。因此必须用数组来直接保存 ; 但是由于坐标点有负数,而且所走的最大距离不超过n*(n+1)/2 ,所以我们不妨将坐标原点移动一定的距离,这样所有的坐标就都是正数了,可以直接判断某个点是不是障碍 。 由于不能重复访问同一个地点,记录访问过的点 。 由于要按照字典序输出,我们搜索的时候按照enswd的顺序就行了 。 有一个可以用来剪枝的原创 2015-08-03 10:45:10 · 829 阅读 · 0 评论 -
hdu-5025 Saving Tang Monk (BFS + 状态压缩)
该是比较简单的BFS的 。 难点在于多了两个限制条件 : 必须按照顺序捡拾钥匙 ; 杀死蛇消耗2单位时间,蛇只会被杀死一次 。因为在拿到第n把钥匙前必须拿到第n-1把,所以只需要加一维大小是11的维度来维护当前拿到的钥匙情况就可以完整的表示所有状态了 。但是还有蛇的条件,所以不妨在结构体里加一个正数,将其压缩成一个集合表示第i只蛇是不是被杀死了 。 所以事先对所有的蛇进行编号就行了原创 2015-08-14 19:39:16 · 990 阅读 · 0 评论 -
11882 - Biggest Number(DFS + 剪枝)
网上很多人都是用的DFS加上BFS判断后续结点最大数量然后用来剪枝, 我只是用了DFS就过了~其实方法很简单,收到了例题 “万圣节后的早晨” 一题的启发,其实矩阵中有很多无用的障碍格,所以在搜索的时候就会多出很多无用的判断 。 因此我们不妨将有用的格子提出来再建一张图,然后DFS,如果只是这样发现会超时,其实对于一个样例来说最浪费时间的情况是:当前答案的长度为所有格子数时,不可能有其他更长的了原创 2015-08-13 10:47:07 · 1917 阅读 · 0 评论 -
307 - Sticks (深搜 + 剪枝)
由于要求最小长度,所以可以从小到大枚举木棍的长度 ,显然,木棍最小值为所给木棍的最大值 。 所以从该值开始枚举木棍长度,则木棍如果大于所有木棍之和,那么答案肯定就是所有之和了 。该题时间卡的比较紧,需要努力剪枝 ,总的来说就是找到几种肯定不会得到最优解的情况,然后直接回溯 。细节见代码:#includeusing namespace std;const int maxn = 100原创 2015-08-12 21:43:28 · 1074 阅读 · 0 评论 -
211 - The Domino Effect(暴力)
很水的暴力,直接暴就行,连剪枝都不需要 。 紫书上描述的很少,只看紫书肯定觉得不知所云,建议大家读读原文 , 看好输入输出格式,明白了题目意思就很好做了 。大致的意思就是如果相邻的两个数字可以出现上面的组合就能换成对应的骨牌,但是要注意,任意答案中只能出现2个骨牌的值相同,所以加个数组判重就行了。细节参见代码:#includeusing namespace std;int kase原创 2015-08-12 10:24:05 · 874 阅读 · 0 评论 -
1343 - The Rotation Game (IDA*算法)
紫书上给的是状态空间搜索,其实本题也可以用IDA*算法,因为其符合IDA*的特点 : 求最小迭代次数 。根据旋转的规律,我们可以用几个数组来储存向各个方向旋转时改变哪些量,用来维护旋转这个操作 。另外就是估价函数:当前出现在中间八个格子中次数最多的数字设为t ,那么剩下的迭代次数就是8 - t , 如果它加上已经迭代的次数d > maxd ,则应当剪枝 。另外想到了一个估算回溯法的时间复原创 2015-08-11 20:51:21 · 1033 阅读 · 0 评论 -
1601 - The Morning after Halloween(BFS)
该题时限还是比较宽的,但是如果纯BFS还是会超时,所以要注意题目中的暗示 :任何一个2*2子网格中至少有一个障碍格 。 这表明障碍格有很多,那么重复搜索这些障碍格将会造成极大的浪费(因为我们开了三维数组记录三个鬼的状态,格子越多,状态也会以三次方的速度增加)。 所以我们可以将不是障碍的格子提出来再建一张图,用邻接表的方式。那么怎么来建图呢? 受坐标离散化的启发,我们可以将每一个有用的格子映原创 2015-08-11 09:00:23 · 1281 阅读 · 0 评论 -
1374 - Power Calculus (迭代加深+剪枝)
题目要求乘除法的最少次数,其实就是一个数组中一开始只有一个数:1 ,每次可以从数组中取两个数(可以取同一个数)相加生成一个新数加如数组 。那么显然这是一个迭代加深搜索,从小到大枚举深度上限 。为了降低时间复杂度,我们要尽量的减少迭代次数,所以我们优先做加法,并且优先将最大的两个数相加,这样可以最快的接近目标 。当然,有一个很显然的剪枝: 当每次取最大的两个数相加仍然小于n时要剪枝 。因原创 2015-08-10 20:10:19 · 934 阅读 · 0 评论 -
11214 - Guarding the Chessboard(暴力搜索)
IDA*算法, 从小到大枚举深度上限,不过该题是有深度上限的,题目中的第一个样例表明:最多需要5个皇后就可以覆盖整个棋盘 。 利用紫书上的技巧,我们可以快速的判断任意两个棋子是不是在同一行、同一列、同一对角线 (详情见紫书P193那两个图)。 这样之后暴力搜索就可以了 。 每一层需要O(nm)的复杂度,但是实际上并不需要那么大的复杂度 。和八皇后问题类似 , 当前行之前的行已经放置了皇后,原创 2015-08-05 08:14:33 · 847 阅读 · 0 评论 -
11212 - Editing a Book(IDA*算法)
又一道迭代加深搜索,从小到大枚举上限 。 关键的剪枝部分是写出启发函数,这个比较难。。不过每次剪切后,不正确的数字个数最多减三还是很好理解的,因为我们算不正确数字个数的方法是看当前数字+1是不是等于下一个数字 。 所以每次剪切最多只有3个数字的后继数字发生了改变。 那么 剪枝条件就显而易见了 。代码如下:#includeusing namespace std;const in原创 2015-08-05 10:16:24 · 1167 阅读 · 0 评论 -
HDU 1016 Prime Ring Problem(水题纯暴)
直接DFS就行,连剪枝都不要。 因为要打印所有可能解,也没法剪枝 。因为相邻的元素之和要求互素,所以能成立的解很少,解答树并没有想象中那么大。细节参见代码:#include#include#include#include#include#include#include#include#include#includeusing namespace std;type原创 2015-10-20 16:23:41 · 615 阅读 · 0 评论 -
585 - Triangles(简单题)
很简单的题目,通过观察可以发现,每一行的奇数个都是尖头向下的三角形,偶数个都是尖头向上的。 所以我们不妨分一下类,对于尖头向上的就向下扩展,反之向上扩展。如果可以拓展就更新答案。细节参见代码:#includeusing namespace std;typedef long long ll;const ll INF = 1000000000;const int maxn = 100+原创 2015-09-15 15:26:31 · 663 阅读 · 0 评论 -
UVA 11520 - Fill the Square (暴力)
该题直接暴力即可,因为一定有解,所以对每一个空格,尽可能的放置字典序小的字母就行了。虽然用dfs写的,但是时间复杂度是显然的,最高只有O(n*n*26)。细节参加代码:#includeusing namespace std;typedef long long ll;const int INF = 100000000;const int maxn = 50 + 5;int T,原创 2015-10-01 16:50:49 · 632 阅读 · 0 评论 -
USACO Name That Number(水题暴力)
直接对于字典中的每一个字符串扫描,看看是否等价于输入的数字。 网上有的人做的也太麻烦了。细节参见代码:原创 2015-09-30 21:16:18 · 865 阅读 · 0 评论 -
Codeforces Round #325 (Div. 2) D. Phillip and Trains (BFS)
一开始看这题,还以为是DP,后来写完记忆化搜索之后发现结果怎么也不对,仔细一想,无论时间复杂度还是状态转移好像都不想DP。 后来想了一下,发现应该是BFS(DFS的盲目性太大,而BFS则可以在最早的时刻剪枝)。 所以我们不妨先用一个数组记录下所有列车在各个时间点的状态,然后用来在BFS中做判断。细节参见代码:#includeusing namespace std;typede原创 2015-10-16 17:26:19 · 620 阅读 · 0 评论