POJ1753 Flip Game
摘要:题目链接。分析:枚举所有的操作。将每个4*4的状态用一个 int 表示, 从0 ~ 15编号。 用BFS 枚举每一种操作。#include <cstdio>#include <cmath>#include <iostream>#include <queue>#include <cstring>using namespace std;const int maxn = (1<<16);const int ntype = (1<<16);queue<int> Q;bool vis[maxn];int st
阅读全文
posted @
2013-06-11 10:51
Still_Raining
阅读(438)
推荐(0)
HDU1211 RSA(数论)
摘要:题目链接。分析:组队赛时做的这题,不得不说,感慨万千。因为题目给的是加密文,要求解密,所以就用M = D(c) = cdmod n。 如何d呢,推了推,觉得d是e的乘法逆。结果没过。后来一商量,觉得ASCII也就那么几个,预处理出来不就完了么?这样,是可以A的,不过在比赛的时候,因为一时疏忽,将一个字母打错(注意是一个字母),一直找BUG。结果没来得及。比赛结束才发现打错了个字母。可恨的是,不论怎么改,样例都过,样例给的真是够“奇妙”的。#include <cstdio>#include <cstring>#include <cstdlib>#include
阅读全文
posted @
2013-06-06 22:49
Still_Raining
阅读(475)
推荐(0)
The Largest SCC(强连通分量)
摘要:题目链接。The Largest SCC题目描述Consider a directed graph with N (1 <= N <= 1000) vertices and M (0 <=M <= 20000) edges. The edges are numbered from 1 to M and the verticesare numbered from 1 to N. Now I will make ONE edge bidirectional, andyou are to tell me the number of vertices of the larges
阅读全文
posted @
2013-06-04 20:09
Still_Raining
阅读(304)
推荐(0)
HDU1517 A Multiplication Game(博弈)
摘要:题目链接。题意:两人轮流乘一个2-9的数,从1开始乘,求谁的乘积先大于N。分析: 如果是加法就好做了。凑到剩下的数能整除11,然后对称着加。问题是乘法。所以寻找必胜点(段)。以1000为例。 1000 | 999 ... 112 | 若占住999到112,则对手必胜。必须让对手占领此段。 1000 | 999 ... 112 |111 ... 56 | 因此必占段是111 -? 。如果56被对手占住,则56×2=112,入必败段。问题转化成为占56。 如此循环。如下 1000 | 999 ... 112 |111 ... 56 |55 ... 7 | 6 ... 4 | 3 ...
阅读全文
posted @
2013-05-31 21:16
Still_Raining
阅读(494)
推荐(0)
HDU1944 S-Nim (SG,博弈)
摘要:题目链接。分析:SG模版。详情请参见LCY的课件:http://acm.hdu.edu.cn/forum/read.php?tid=6875AC代码如下:#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 100 + 10;int sg[10000+10], a[maxn], k;int mex(int n) { bool vis[maxn] = {false}; for(int
阅读全文
posted @
2013-05-31 21:12
Still_Raining
阅读(349)
推荐(0)
博弈之简单总结
摘要:最近看了一下《算法竞赛入门经典——训练指南》中的博弈部分,便急切的做了几道HDU上的博弈水题。大喊一声:我以后会继续更新的(希望如此)。两条规则:规则1:一个状态是必败状态当且仅当它的所有后继都是必胜状态。规则2:一个状态时必胜状态当且仅当它至少有一个后继是必败状态。HDU2188 悼念512汶川大地震遇难同胞——选拔志愿者(水)分析:这种类型的题目叫做巴什博奕(BashGame),可以直接做.AC代码如下:#includeint main(){ int T,n,m; while(scanf("%d",&T)!=EOF) while(T--) { scan...
阅读全文
posted @
2013-05-28 21:40
Still_Raining
阅读(276)
推荐(0)
POJ2926 Requirements(最远曼哈顿距离)
摘要:题目链接。分析:借机学习了一下曼哈顿距离问题。(这图很好)我们可以定义曼哈顿距离的正式意义为L1-距离或城市区块距离,也就是在欧几里得空间的固定直角坐标系上两点所形成的线段对轴产生的投影的距离总和。例如在平面上,座标(x1,y1)的点P1与座标(x2,y2)的点P2的曼哈顿距离为:以二维平面为例:设距离最远的两点为 i, j,可知所求的最大距离必定有以下四种形式之一:(xi-xj)+(yi-yj), (xj-xi)+(yi-yj), (xi-xj)+(yj-yi), (xj-xi)+(yj-yi) 变形一下,把相同点的坐标放到一起,即 (xi+yi)-(xj+yj), (-xi+yi)-(-x
阅读全文
posted @
2013-05-25 22:23
Still_Raining
阅读(1784)
推荐(0)
UVA10047 The Monocycle(BFS)
摘要:题目链接。题意:一自行车的轮子被分成5个扇区,涂了5种不同颜色。自行车每1秒要么骑到下一个格子,要么左转或者右转90。。一开始自行车面向北,颜色为绿,到达目标格时,必须触底颜色为绿,但朝向无限制。求到达目标格的最短时间。分析:在原来的二维,增加两个附加因素:朝向和颜色。然后普通BFS就可以了。AC代码如下:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>using namespace std;const in
阅读全文
posted @
2013-05-23 09:29
Still_Raining
阅读(373)
推荐(0)
UVA11324 The Largest Clique(DP+SCC)
摘要:题目链接。题意:给一张有向图G,求一个结点数最大的结点集,使得该结点中任意两个结点 u 和 v满足:要么 u 可以到达 v, 要么 v 可以到达 u(u 和 v 相互可达也可以)。分析:”同一个强连通分量中的点要么都选,要么不选。把强连通分量收缩点后得到SCC图,让每个SCC结点的权等于它的结点数,则题目转化为求SCC图上权最大的路径。由于SCC图是一个 DAG, 可以用动态规划求解。“注意:假设含有 n 个点的图中不含结点数大于 1 的强连通分量,那么缩点后的图含有 n 个点,由于 scc_cnt 是从 1 开始编号,所以初始化时要用<=n 而非 <n。for(int i=1;
阅读全文
posted @
2013-05-21 21:18
Still_Raining
阅读(604)
推荐(0)
HDU2767 Proving Equivalences(scc)
摘要:题目链接。题意:至少增加几条边,才能让图强连通。分析:“首先,找出强连通分量,然后把每个强连通分量缩成一个点(缩点),得到一个DAG。 接下来,设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案。 注意特殊情况: 当原图已经强连通时, 答案是0而不是1."这是《算法竞赛入门经典——训练指南》上的原话。对于证明,搜了一下,没有找到。自己呢,试着画了一下,记下个人心得。自己的理解如下;一个含n个点的图,至少要有n条边,才能强连通。即每一个点至少都会有一个入度和出度。对于得到的DAG,设有a个结点的入度为0, b个结点的出度为0,因为增加一条边会同时增加一个入度
阅读全文
posted @
2013-05-21 19:28
Still_Raining
阅读(808)
推荐(0)
HDU1269 迷宫城堡(有向图的强连通分量(scc))
摘要:题目链接。题意:判断是否有向图是否强连通。分析:模板题。判断一个图是否为强连通,即用Tarjan算法看强连通分量(SCC)是否为1.#include <iostream>#include <vector>#include <stack>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 10000+10;const int maxm = 100000+10;vector<int>
阅读全文
posted @
2013-05-21 16:35
Still_Raining
阅读(223)
推荐(0)
Greatest Number
摘要:GreatestNumberProblem Description Saya likes math, because she think math can make her cleverer. One day, Kudo invited a very simple game: Given N integers, then the players choose no more than four integers from them (can be repeated) and add them together. Finally, the one whose sum is the larg...
阅读全文
posted @
2013-05-18 20:36
Still_Raining
阅读(468)
推荐(0)
UVA1449 Dominating Patterns(AC自动机)
摘要:题目链接。分析:表示对AC自动机还不能完全理解,所以在纸上手绘了下 getFail 和 find 的过程,表示理解的深刻些了。好,继续加油!分析详见《算法竞赛入门经典——训练指南》P216。#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>#include <stack>#include <vector>#include <queue>#include <map
阅读全文
posted @
2013-05-17 21:28
Still_Raining
阅读(242)
推荐(0)
UVA11624 Fire!(BFS)
摘要:题目链接。分析:先用BFS将所有的火能到达的时间计算出来,然后再一次BFS,计算最短路径。要求人每到一个方格的时间,必须小于该方格的着火时间。直到走到边界。注意:WA很多次。。后来想出来了。少考虑了一种情况,那就是人一开始就在边界的情况。AC代码如下:#include <iostream>#include <cstdlib>#include <cstdio>#include <algorithm>#include <cstring>#include <stack>#include <vector>#includ
阅读全文
posted @
2013-05-13 20:58
Still_Raining
阅读(464)
推荐(0)
SDUT2622 最短路(spfa)
摘要:题目链接。题目:最短路径题目描述为了准备一年一度的校赛,大家都在忙着往赛场搬运东西,比如气球什么的。这时YY也没有闲着,他也加入了搬运工的行列。已知学校有N个路口和M条路,YY并不是把东西直接搬到赛场,而是从S路口搬运到T路口。由于YY非常懒而且他有轻度强迫症。所以他要走的路需要尽可能的短,并且走过路径的数目要为X的倍数。输入输入的第一行为一个正整数T(1≤T≤20),代表测试数据组数。对于每组测试数据:输入的第一行为两个正整数N和M(1≤N≤100, 1≤M≤10000)。接下来M行每行三个正整数U、V、W(0≤U,V<N, 0≤W≤230),代表有一条从U到V的长度为W的有向路径。最
阅读全文
posted @
2013-05-12 12:41
Still_Raining
阅读(348)
推荐(0)
SDUT2619 地板砖(状态压缩DP)
摘要:题目链接。题目原文:地板砖题目描述利用假期时间,豆豆找个了临时工,帮有钱人家贴地板砖,假设房子的形状为N x M的矩形,每个地板砖的大小为1 x 1,且只有黑白两种颜色,这家人很奇怪,他们不喜欢房间中任何一个2 x 2的局部区域的4块地板砖的颜色一样。如果出现这种图案,豆豆就要重新贴,这当然难不倒豆豆,但爱学习的豆豆,想知道满足要求的贴法一共用多少种。如下图所示:Figure 1.为满足要求的贴法,Figure 2.为不满足要求的贴法输入输入包含多组测试数据,对于每组测试数据:输入只有两个正整数N、M(N≤500, M≤5),分别代表房间的长度和宽度。输出对于每组测试数据,输出满足要求的贴法总
阅读全文
posted @
2013-05-10 23:04
Still_Raining
阅读(280)
推荐(0)
POJ3630 Phone List
摘要:题目链接。分析:之前做过类似的题,用的字典树链表写法,今天在训练指南上学了字典树数组的写法。#include <iostream>#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int maxnode = 10000*10+10;const int sigma_size = 10;struct Trie { int ch[maxnode][s
阅读全文
posted @
2013-05-09 22:53
Still_Raining
阅读(159)
推荐(0)
UVA1428 Ping pong(树状数组)
摘要:题目链接。题意:n个人,从左到右排列,每个人都有一个不同的技能值 ai, 每场比赛3个人: 两名选手, 一名裁判。 裁判必须在两名选手中间, 并且技能值也在两名选手之间, 问一共能组织多少种比赛。分析: 考虑第i个人当裁判的情形。假设 ai 到 ai-1 中有 ci 个比 ai 个小, 那么就有 (i-1)-ci 个比 ai 大; 同理, 假设 ai+1 到 an 中有di个比ai 小, 那么就有 (n-i)-di 个比 ai 大。 根据乘法原理和加法原理, i当裁判 有 ci(n-i-di)+(i-ci-1)*di 种比赛。 这样问题转化为求 ci 和 di. 题目已经明确每个人都有一个..
阅读全文
posted @
2013-05-07 20:51
Still_Raining
阅读(223)
推荐(0)
HDU1754 I Hate It(树状数组 or 线段树)
摘要:题目链接。分析:本题可以用树状数组,也可以用线段树。树状数组:对于树状数组,请详见本随笔。要注意的是,比如说上图,要求 2 到 4 之间的最大值, c[4] 并非 2 到 4 之间的最大值,因为 c[4] 是 1 到 4 之间的最大值。这时候就只能单独看A[4], A[3], A[2]了。AC代码:#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>using namespace std;const int maxn = 200000 + 10;int n
阅读全文
posted @
2013-05-03 09:46
Still_Raining
阅读(217)
推荐(0)
HDU2174 kiki's game(博弈)
摘要:题目链接。分析:博弈论水题。要使行列都走到关键数.如果行是关键数,列不是,就向下走一;如果行是行不是关键数,列是,就想左走一;如果行列都不是,就想左下走一;如果行列都是的话,就pity了。#include <iostream>#include <algorithm>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include <stack>#include <map>using namespace std;
阅读全文
posted @
2013-04-29 23:51
Still_Raining
阅读(216)
推荐(0)