摘要:
二分图匹配题意:给定一个r*c的棋盘,其中每列有2个白色格子,其余为黑色。要求选出c个白色格子,且每列一个,且每行至少一个。问能否实现,给出方案。分析:如果r>c则必定无法满足,因为即使每列一个,均位于不同行,还是会有某些行没有被选中的格子。对于其余情况,先进行简单的二分图匹配(每行作为1点构成第一点集,每列作为1点构成第二点集,每个白色格子作为连接其行列点的边),如果每行都能匹配上则首先可以保证每行都有选中的格子,当然此时可能有一些列还有没有被选中的格子,只要在该列里随便选1个白的就行了,不会影响结果。View Code #include <iostream>#includ 阅读全文
posted @ 2011-09-29 21:41
undefined2024
阅读(365)
评论(0)
推荐(0)
摘要:
题意:从左到右n个格子,某些有石子,每格永远只能放一个石子,每次可以将某个石子向左移若干格,但不能跨越任何石子。两人轮流操作,谁无路可走谁输。分析:我们把棋子按位置升序排列后,从后往前把他们两两绑定成一对。如果总个数是奇数,就把最前面一个和边界(位置为0)绑定。 在同一对棋子中,如果对手移动前一个,你总能对后一个移动相同的步数,所以一对棋子的前一个和前一对棋子的后一个之间有多少个空位置对最终的结果是没有影响的。于是我们只需要考虑同一对的两个棋子之间有多少空位。我们把每一对两颗棋子的距离(空位数)视作一堆石子,在对手移动每对两颗棋子中靠右的那一颗时,移动几位就相当于取几个石子,与取石子游戏对应上 阅读全文
posted @ 2011-09-29 16:39
undefined2024
阅读(1309)
评论(0)
推荐(1)
摘要:
题意:给定若干基因片段,求包含所有片段的最短基因序列长度。分析:cost[i][j]表示把j串接在i穿后面最少需要添加几个字符,先求出整个cost矩阵,然后枚举这些串的全排列,对于每种排列求长度,更新最小值。View Code #include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define maxn 15#define maxl 25int n;char gen 阅读全文
posted @ 2011-09-29 15:42
undefined2024
阅读(931)
评论(0)
推荐(1)
摘要:
二分简单题View Code #include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <cmath>using namespace std;struct Elem{ int a, b;}ans;double n;int lim;int binarysearch(int x){ int l = 1; int r = min(lim, x * 10); while (l < r) { int mid = (l + r) / 2; 阅读全文
posted @ 2011-09-29 09:28
undefined2024
阅读(393)
评论(0)
推荐(0)
摘要:
题意:求割点,并求出去掉每个割点图会被分成几个连通分支。分析:求割点除了tarjan算法,还有一种O(n^2)的算法,就是分别把每个点作为根,进行dfs,看根有几个子结点,如果大于一个则为割点否则不是割点。本题就是观察每个点为根时有几个子结点,去掉该点后的连通分支数等于其子结点数。View Code #include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;#define maxn 1005struct Edge{ int 阅读全文
posted @ 2011-09-29 08:44
undefined2024
阅读(441)
评论(0)
推荐(0)