随笔分类 -  搜索/暴力/穷举

摘要:求出不使用P点时起点到终点的最短距离,求出起点到所有P点的最短距离,求出终点到所有P点的最短距离。答案=min( 不使用P点时起点到终点的最短距离, 起点到P的最短距离+终点到P的最短距离 )#include #include #include #include #include using namespace std;const int MAXN = 5100;const int INF = 1 = 0 && x = 0 && y Q; st.cost = 0; vis[ st.x ][ st.y ] = true; Q.push(st); while ( ! 阅读全文
posted @ 2014-03-08 18:51 冰鸮 阅读(514) 评论(2) 推荐(0) 编辑
摘要:每个点求一次最短路,在最短路中找最长的。用邻接表存边,尽量不要用STL,很容易超时。#include #include #include #include using namespace std;const int MAXN = 1010;const int INF = 1 n = n; this->m = 0; for ( int i = 0; i d[u] + 1 ) { d[v] = d[u] + 1; Q[tail++] = v; ... 阅读全文
posted @ 2013-10-10 15:23 冰鸮 阅读(242) 评论(0) 推荐(0) 编辑
摘要:没什么巧办法,直接搜就行。用余数作为每个节点的哈希值。#include #include #include const int MAXN = 10100;struct node{ int mod; int fa; int digit; node() {} node( int mod, int fa, int dig ):mod(mod), fa(fa), digit(dig) { }};int N;bool ok[12];bool vis[MAXN];node Q[MAXN << 2];void findFa( int u ){ if ( u == -1 )... 阅读全文
posted @ 2013-10-09 21:15 冰鸮 阅读(205) 评论(0) 推荐(0) 编辑
摘要:与其说这是个博弈,倒不如说是个搜索。这题思路不错,感觉很难把情况考虑周全。在地图外围填充一圈0,两次BFS,第一次从-1点出发,把从-1到达的0点以及包围0的那一圈石头标记出来。如下图:6 71 1 1 1 1 1 11 0 0 0 0 0 11 0 3 5 1 1 11 0 -1 4 0 1 11 0 1 0 0 1 11 1 1 1 1 1 1第二次BFS,从外围(0,0)点出发,找出外面与标记石头的交界层:6 71 1 1 1 1 1 11 0 0 0 0 0 11 0 3 5 1 1... 阅读全文
posted @ 2013-09-25 10:48 冰鸮 阅读(278) 评论(0) 推荐(0) 编辑
摘要:训练指南p.59#include #include #include #include using namespace std;const int MAXN = 30;int N;int A[MAXN];char str[1010];map table;int bitcount( int x ){ int res = 0; while ( x ) { if ( x & 1 ) ++res; x >>= 1; } return res;}int main(){ while ( scanf( "%d", &N ) == 1 ) ... 阅读全文
posted @ 2013-09-09 16:33 冰鸮 阅读(271) 评论(0) 推荐(0) 编辑
摘要:DLX经典题型,被虐惨了……建一个2*N行3*N列的矩阵,行代表选择,列代表约束。前2*N列代表每个人的哪种状态,后N列保证每个人至多选一次。显然对手可以被战胜多次(重复覆盖),每个角色至多选择一次(精确覆盖)。注意事项:1.行数=∑每个人的模式数,之前我直接把行数当2*N了……但实际上也会有人只有一种模式的,也就是说实际行数小于等于2*N2.建图的时候注意:这个人不光能覆盖他所战胜的某角色的某模式,还覆盖了他自己的所有模式(因为他不用战胜自己)。之前没注意这个问题,样例全成无解了orz……3.处理精确覆盖和重复覆盖的先后顺序。如果优先处理精确覆盖,会把重复覆盖的一些行也删掉,这样前面可以重复 阅读全文
posted @ 2013-08-18 15:37 冰鸮 阅读(406) 评论(1) 推荐(0) 编辑
摘要:以下转自 这里 :最小支配集问题:二分枚举最小距离,判断可行性。可行性即重复覆盖模型,DLX解之。A*的启发函数:对当前矩阵来说,选择一个未被控制的列,很明显该列最少需要1个行来控制,所以ans++。该列被控制后,把它所对应的行,全部设为已经选择,并把这些行对应的列也设为被控制。继续选择未被控制的列,直到没有这样的列。#include #include #include #include #include using namespace std;const double eps = 1e-9;const int INF = 1 K ) return false; int minv = ... 阅读全文
posted @ 2013-08-17 20:41 冰鸮 阅读(266) 评论(0) 推荐(0) 编辑
摘要:推荐两篇学DLX的博文:http://bbs.9ria.com/thread-130295-1-1.html(这篇对DLX的工作过程演示的很详细)http://yzmduncan.iteye.com/blog/1151695(这篇对精确覆盖与重复覆盖解释的简洁清晰,模板来自这篇博文)以下转载:DLX解决9*9的数独问题,转化为729*324的精确覆盖问题行:一共9*9*9==729行。一共9*9小格,每一格有9种可能性(1-9),每一种可能都对应着一行。列:一共(9+9+9)*9+81==324种前面三个9分别代表着9行9列和9小块,乘以9的意思是9种可能(1-9),因为每种可能只可以选择一个 阅读全文
posted @ 2013-08-17 19:07 冰鸮 阅读(272) 评论(0) 推荐(0) 编辑
摘要:每层找一对相等的整数,分别放在两个不同的串中。参考了学弟的解法,果断觉得自己老了……#include #include #include const int MAXN = 2010;int n;int num[MAXN];int vis[MAXN];bool DFS( int st, int last, int cur ){ if ( cur == n / 2 ) return true; for ( int i = st; i last ) { vis[j] = 1; if... 阅读全文
posted @ 2013-08-08 19:41 冰鸮 阅读(351) 评论(0) 推荐(0) 编辑
摘要:题意:给一些n,求出最小的只包含0,1的n的倍数设两数a, b满足: a #include #include #include using namespace std;const int MAXN = 20010;struct node{ int val; int pre;};int n;int ans[MAXN];node D[MAXN];void solved(){ memset( D, -1, sizeof(D) ); queue Q; Q.push(1); D[1].val = 1; D[1].pre = -1; while ( !Q.e... 阅读全文
posted @ 2013-08-07 20:25 冰鸮 阅读(387) 评论(0) 推荐(0) 编辑
摘要:问这个人掉落的海域包含几个岛屿。八方向相连为同一片海域,四方向相连为同一个岛屿。与边界相连的岛屿不算。方法:在给定地图外面填充一圈".",从这个人掉落的地方开始进行floodfill,标出他所在的海域。然后再从(0, 0)点进行一次floodfill,把之前标记的海域之外的东西全部清掉。最后统计岛屿个数即可。注意:坐标是反着的#include #include #include #include #include using namespace std;const int MAXN = 510;const int dx[] = { -1, 0, 1, 0, -1, -1, 阅读全文
posted @ 2013-08-05 18:46 冰鸮 阅读(272) 评论(0) 推荐(0) 编辑
摘要:设horns和hoofs的数量分别为 x 和 y ,题目要求:满足 x+y 2 #include 3 #include 4 #include 5 #include 6 7 const double eps = 1e-3; 8 const double INF = 1e10; 9 10 using namespace std; 11 12 double A, B; 13 int N; 14 15 int dcmp( double a ) 16 { 17 if ( fabs(a) i ) tmp = i; 39 40 doubl... 阅读全文
posted @ 2013-08-05 12:35 冰鸮 阅读(235) 评论(0) 推荐(0) 编辑
摘要:一共才100个正方形,将所有正方形左下角和右上角的X坐标和Y坐标离散化,直接枚举新建公园的点的坐标即可。O(n^3)的时间复杂度。 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int MAXN = 110; 9 const int INF = 255; 10 11 struct Land 12 { 13 int x, y; 14 int len; 15 int import; 16 }; 17 18 int N, K, M;... 阅读全文
posted @ 2013-08-04 10:12 冰鸮 阅读(273) 评论(0) 推荐(0) 编辑
摘要:将起始点、终点和钥匙统一编号,预处理:1.起始点到所有钥匙+终点的最短路2.所有钥匙之间两两的最短路3.所有钥匙到终点的最短路将起始点和所有钥匙四方向出发设为起点BFS一遍,求出它到任意点任意方向的最短路dp[i][j][k]。(即到点(i,j)且方向为k的最短路),BFS时需要注意:1.UDLR有可能组成死循环2.转向符在墙边并且指向了墙时,无法重新选择方向。例如这个: S...L#E3.只有豆腐块滑动碰到墙停止了之后,才能把这个点的坐标加入队列。在滑动过程中经过的点都不需要加入队列。4.钥匙在墙边的情况。在一次滑动过程中,豆腐块经过K时只有一个方向。但是如果K在墙边,并且滑动方向可以使豆腐 阅读全文
posted @ 2013-08-03 10:55 冰鸮 阅读(403) 评论(0) 推荐(0) 编辑
摘要:二分H2的位置,判断条件为是否有Hi 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const double eps = 1e-9;10 11 int N;12 double A;13 14 int dcmp( double a )15 {16 if ( fabs(a) 0 )41 {42 //++cnt;43 double mid = ( l + r ) / 2.0;44 //pri... 阅读全文
posted @ 2013-08-02 21:31 冰鸮 阅读(166) 评论(0) 推荐(0) 编辑
摘要:原地址:http://www.wumii.com/item/W4Q5yFme个人觉得这是套比较好的搜索题目,涵盖了基本的经典搜索题型。-----------------------------------------------------------格式说明:题目名后面列出个人此题的大致难度(对菜鸟而言)POJ 1069 -The Bermuda Triangle(难)http://acm.pku.edu.cn/JudgeOnline/problem?id=1069题意:用给定三角型填充六边形解法:此题的思想上精华在于坐标化ps:传说中比较bt,确实比较bt,主要很容易写错,我ac了,但程序 阅读全文
posted @ 2013-08-01 18:35 冰鸮 阅读(220) 评论(0) 推荐(0) 编辑
摘要:搜索+最优性剪枝。DFS的下一层起点应为当前选择的 i 的下一个,即DFS(i + 1)而不是DFS( cur + 1 ),cur+1代表当前起点的下一个。没想清楚,TLE到死…… 1 #include 2 #include 3 #include 4 #include 5 6 using namespace std; 7 8 const int MAXN = 40; 9 10 struct node 11 { 12 int t, id; 13 int cnt; 14 int fruit[12]; 15 }; 16 17 int N, M... 阅读全文
posted @ 2013-07-28 16:26 冰鸮 阅读(360) 评论(0) 推荐(0) 编辑
摘要:500ms时限406ms水过……直接枚举肯定超时,需要剪枝。枚举每个格子的元素,检查其左上角和正上方格子是否满足条件,若不满足不必再向下搜索。在 这里看到一个更好的方法:枚举每个格子是哪个相邻的比它大。然后DFS看看有没有环。这样的复杂度只有(2^5*3^5)。不过我没写出来……而且也不太清楚这个时间复杂度是怎么算的……求指点! 1 #include 2 #include 3 #include 4 5 const int dx[] = { -1, 1, 0, 0 }; 6 const int dy[] = { 0, 0, -1, 1 }; 7 8 int N; 9 ... 阅读全文
posted @ 2013-07-25 20:42 冰鸮 阅读(364) 评论(0) 推荐(0) 编辑
摘要:解释一下样例,因为我觉得这个题意表述的不是很清楚。以第二组样例为例。牌序为:3 1 4 5 2第一轮:把 3 放到末尾:1 4 5 2 3,最顶上的牌是1,把1拿走。剩余 4 5 2 3第二轮:1.把4放到末尾:5 2 3 4 2.把5放到末尾:2 3 4 5 最顶上的牌是2,把 2 拿走,剩余:3 4 5第三轮:1.把3放到末尾:4 5 3 2.把4放到末尾:5 3 4 3.把5放到末尾:3 4 5 最顶上的牌是3,把 3 拿走,剩余:4 5第四轮:1.把4放到末尾:5 4 2.把5放到末尾:4 5 3.把4放到末尾:5 4 4... 阅读全文
posted @ 2013-07-24 14:24 冰鸮 阅读(324) 评论(0) 推荐(0) 编辑
摘要:把所有的点都映射到XOZ这个平面的第一象限内,则这个三维问题可以转化二维问题:求一条直线,使所有点在这条直线的下方,直线与X轴和Z轴围成的三角形旋转形成的圆锥体积最小。这样转化之后可以看出直线的临界条件应当是经过其中一点。三分圆锥半径R,因为要覆盖所有的点,让点(R, 0)与所有点连线,直线与Z轴交点即为H,H取其中最大的那个。 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 #define EPS 1e-9 8 9 using namespace std;10 11 const int MAXN = 1001... 阅读全文
posted @ 2013-07-20 17:37 冰鸮 阅读(415) 评论(1) 推荐(0) 编辑

点击右上角即可分享
微信分享提示