关于程序
文章平均质量分 71
LiWen_7
这个作者很懒,什么都没留下…
展开
-
hdu 1150Machine Schedule(最小顶点覆盖)
首先必须知道König定理: 最大匹配值 = 最小顶点覆盖。该定理的证明(转自):http://www.matrix67.com/blog/archives/116二分图最大匹配的König定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把König定理证了,其它的废话一概没有。 以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上原创 2012-07-29 16:40:47 · 743 阅读 · 0 评论 -
博弈论
转_博弈论(比较全)博弈论(一):Nim游戏重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算。Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了解博弈论恐怕是最合适不过了。Nim游戏是组合游戏(Combinat转载 2012-09-04 17:49:48 · 5555 阅读 · 1 评论 -
hdu 1536、hdu 1944 S-Nim(博弈SG函数)
题意:多组测试数据 ,输入 k个集合S的元素,m种情况,m种(L堆,每堆hi个)。 若存在移动某堆能到达一个必败点,则该点为必胜点,输出W 必败点指无论怎么移动都只能到达必胜点,输出L。思路:SG函数 每堆看做一个子游戏,SG函数通过递归得到每种堆数的g();SG函数定义:对于一个递增有界的图G(X, F原创 2012-09-04 18:19:56 · 4313 阅读 · 0 评论 -
hdu 1827 Summer Holiday (Tarjan算法)
#include#includeusing namespace std;int stack[1010],top ,size, step ,color;int in[1010],dfn[1010],low[1010];int rd[1010],price[1010],sum,num;struct E{ int v, next;}e[2010];int head[1010原创 2012-08-24 16:17:55 · 718 阅读 · 0 评论 -
coj 1509 Build the given towers
题意:给定一个左视图,要求给定的方块数能否垒成这么一个视图。方块数不要求全部用完。垒数不能超过W。 解答:此题我们采用贪心解决。由于W有限,如果没有黑色的‘b’,我们是可以只用一垒就摆出给定的视图。贪最少的垒,只有到出现奇数个连续的‘b’时,这是我们要将2*1*1的black块挡住一半,使得左视图只看到一个‘b’,这时才要新摆放一个垒。我们从后往前,从高往低摆放视图,至于需要用来作为垫原创 2012-08-24 09:52:39 · 613 阅读 · 0 评论 -
poj 2186 Popular Cows (tarjan + 缩点)
题意 :n头奶牛,m组关系(a b代表a认为b受欢迎)。求最后有多少头奶牛所有奶牛都认为它受欢迎。思路:首先用tarjan算出连通分支数,将所有点都标上所属连通分支color。将每个分支看做一个点,若某点a受到另一点b联系,则说明该点a代表的连通分支中每个原始点都受到b中以及所有认为b受欢迎的点的欢迎,所以此处用dfs计算出每个分支中被多少人欢迎。代码(比较繁琐):#inc原创 2012-08-25 16:29:46 · 568 阅读 · 0 评论 -
hdu 1850 Being a Good Boy in Spring Festival(尼姆博弈加强)
题意: 最后取完的选手胜利,与1907刚好相反。并输出若胜利,则第一步有多少种取的方式。综上所述,若是 S2,S1,T0 。 则先下的人必输。 若是 T2,S0 。则先下的人必胜。#include#includeusing namespace std;int main(){ int n , a[110] ,原创 2012-09-04 01:05:30 · 1000 阅读 · 0 评论 -
hdu 2767 Proving Equivalences (tarjan + 缩点)
/*题目大意:给定一张有向图,问最少添加几条边使得有向图成为一个强连通图。解题思路:缩点后找入度为0的点和出度为0的点,统计个数,选择大的那个数就是答案。 如果出度为0的个数n比入度为0的个数m多,那添加n条边,从当前出度为0的点到 其他入度为0的点,肯定能成为强连通图,同理可得m大也可以。(各连通分支间 可能需要1条或2条,才能使两个连原创 2012-08-25 01:33:26 · 565 阅读 · 0 评论 -
hdu 3394 (无向图求块 判断环)
题意描述: 公园有n个景点,公园的管理员计划要建m条道路,并且安排一些形成回路的参观路径,如果一条道路可以被多条回路共用, 那么这条边是冲突边,如果一个块中有多个环,则该块中的每条边都是冲突边。 如果不能形成环的路则为不需要的边,现在就是求无向图中冲突边和不需要边的条数解题思路: 把图分为多个块,然后判断每个块里面的边数,如果块的边数原创 2012-08-27 15:56:11 · 1653 阅读 · 0 评论 -
hdu 1517 A Multiplication Game(博弈找规律)
1 2-----9 、 (9+1) ------- (2*9)、(2*9+1) ------- (2*9*9) 、(2*9*9+1) ------ (2*9*9*2)、(2*9*9*2+1) ------(2*9*9*2*9) ...... N P N原创 2012-09-05 16:35:59 · 1484 阅读 · 0 评论 -
hdu 2147 kiki's game(基础博弈)
定义:必胜点(N点):下一个选手将取胜的点(将物品取完)。必败点(P点):前一个选手取胜的点(此时物品已经取完,或后面某次轮到当前选手时物品已经取完)。属性:1 、必胜点N点,一定有某种方法到达必败点P点。2、必败点P点,无论通过什么方法都只能到达必胜点N点。我们可以确定最后一个必败的情况(即物品数目为0,此题是指点(n,1)的位置,三个方向都找不到空位),然后反着原创 2012-09-04 00:08:46 · 1116 阅读 · 0 评论 -
hdu 1907 John(取火柴游戏)
尼姆博奕(Nimm Game): 有三堆各有若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。 用(a , b , c)表示某种局势,首先(0, 0 , 0)显然是奇异局势(即后取得人一定取光物品),第二种奇异局势是(0 , n , n),只要与对手拿走同样多的物品,最后都将导致(0 , 0 , 0)。第三种(1 , 2 , 3)也是奇异原创 2012-09-03 16:59:08 · 1919 阅读 · 0 评论 -
Tarjan 算法
[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通分量(strongly connected components)。下图中,子图{1,2,3,4}为一个强连通分量,因为顶点1,2,3,4两两可达。{5},{6}转载 2012-08-24 15:54:14 · 558 阅读 · 0 评论 -
hdu 1151 DAG图(有向无环图)的最小路径覆盖
/*DAG图的最小路径覆盖,最小路径覆盖数 = 顶点数 - 最大匹配数解释:一条路径覆盖两个点,意思是最大匹配可以覆盖->(2 * 最大匹配)个点一个匹配,一条路径剩下的点都需要单独一条边覆盖所以:最大匹配数 + (n - 2 * 最大匹配数)= 最小路径覆盖*/#include#includeusing namespace std;const int VN=1510;con原创 2012-07-31 15:23:19 · 1753 阅读 · 0 评论 -
3478 Catch (判断是否为二分图,dfs奇偶染色)
题意:给出一个无向图,一个起点,问是否在某个时候,这个人有可能在所有点都可以出现人不能停留在原地只有当该无向图中出现由奇数个点组成的环,才可能访问每个点时即可能为奇数又可能为偶数。所以:如果我们把图中奇数时刻能够到达的点归到X集合,偶数能到点归到Y集合,那么如果图中出现相同集合的点有 边相连,那么就不满足二部图的性质,即可输出Yes,如果原图可二部图话,答案就是No了(无向图G为二部图原创 2012-07-31 21:48:19 · 2384 阅读 · 0 评论 -
1281棋盘游戏(二分匹配+删边)
不能放车的地方不影响车的互相攻击。因为不影响,所以可以以整行,整列为单位建图因为要删边,矩阵方便点求最大匹配数,但是这题还有一个要求是:求有多少个关键点,该关键点是指:若没有这一点则“车”放的个数将减少(即:匹配数量减少)。那就模拟下,原来有边的点除去,检测最大匹配数是否和原来一样如果一样,则不是关键点,如果是,则是关键点,累加#原创 2012-07-31 17:17:46 · 1143 阅读 · 0 评论 -
hdu 1827 Summer Holiday (强连通Kosaraju法)
题意: 输入n、m ,n表示人数和联系对数。联系不同人的花费不同,需要找到花费最少为多少。思路:找到强连通分支(标记同一分支中的点),然后每个分支中最多只需要联系一个人即可,但若两个分支中有联系则只需联系其中一个花费小的,即将每个分支看做一个点,找分支间的出、入度关系。#include#include#define size 1010#define INF 1000000000原创 2012-08-16 10:48:31 · 1596 阅读 · 0 评论 -
coj 1504 放置棋子(诸侯安置)dp
很久以前,有一个强大的帝国,它的国土成正方形状,如图2—2所示。 这个国家有若干诸侯。由于这些诸侯都曾立下赫赫战功,国王准备给他们每人一块封地(正方形中的一格)。但是,这些诸侯又非常好战,当两个诸侯位于同一行或同一列时,他们就会开战。如下图2—3为n=3时的国土,阴影部分表示诸侯所处的位置。前两幅图中的诸侯可以互相攻击,第三幅则不可以。 国王自然不愿意看到他的诸侯们原创 2012-08-16 10:20:54 · 2144 阅读 · 0 评论 -
ccsu 1179 青蛙过河 递推
题目:有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图2—5所示。 n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为: 1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小); (2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,原创 2012-08-17 16:59:01 · 1956 阅读 · 0 评论 -
poj 2117 Electricity (无向图割点去除后最大连通分支数)
题意:求去除一点后,形成的连通分支数的最大值。(使最多的网络不能跟原路线相连)顶点u是割项当且仅满足 (1) 或 (2)时:(1) 若u是树根,且u的孩子数 son>1 。因为没有u的后向边,以这些孩子为根的子树之间互不相连通,所以去掉u后将得到son个分支。(2)若u不是树根,且存在树边 ( u , v ) 使low ( v ) >= dfn ( u )。low值说明原创 2012-08-29 11:44:39 · 3284 阅读 · 0 评论 -
poj 1144 Network (无向图求割点)
#include#include#includeusing namespace std;vector vec[110];int dfn[110] , low[110],in[110];int n, step , sum ;void init(){ for(int i=0;i<110;i++) { dfn[i]=low[i]=in[i]=0; v原创 2012-08-31 15:13:55 · 1210 阅读 · 0 评论 -
hdu 1527 升级 2177(威佐夫博奕)
理论:(来自:http://www.wutianqi.com/?p=1081)威佐夫博奕(Wythoff Game):有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。 这种情况下是颇为复杂的。我们用(ak,bk)(ak ≤ bk ,k=0,1,2,…,n)表示两堆物品的数原创 2012-09-03 11:25:24 · 2618 阅读 · 0 评论 -
鸽巢原理(抽屉原理)
鸽巢原理和抽屉原理是同义词,已合并。抽屉原理百科名片 抽屉原理桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面放两个苹果。这一现象就是我们所说的“抽屉原理”。 抽屉原理的一般含义为:“如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1或多于n+1个元素放到n个转载 2012-03-30 13:00:19 · 6571 阅读 · 0 评论 -
ccsu 数星星
#include#includeusing namespace std;int start[1001][1001]={0};int main(){ int n,m; int x,y; int num,x1,y1,x2,y2,sum; scanf("%d",&n); for(int i=0;i<n;i++) { sca原创 2012-03-07 20:18:01 · 537 阅读 · 0 评论 -
poj 3370 Halloween treats(反演定理+鸽巢原理)
题意: 已知有n户人,每户会给小孩们一定数量的糖果(会给的数量假设小孩都已知),求小孩挑选哪几户人家,所得糖果总数能够使每个小孩得到相同数量的糖果,即是小孩数目的倍数?思路:定理: 设a1、a2……am是正整数的序列,则至少存在整数k和l,(1 证明:x%m的余数有(m-1)中可能,即设有(m-1)个鸽巢,设sn代表(a1+a2+...+an)则m个sn产生m原创 2012-10-08 10:50:56 · 1776 阅读 · 0 评论 -
ccsu 1546 数字游戏
Description自从小黑上次在和大宝的游戏中取得了信心之后,这次他又想到了一个问题,他要去计算两个数A和B的最大公约数。 由于这两个数非常的大,于是大宝把数字A拆成了N个数,这N个数相乘的结果是A,把B拆成了M个数,同样这M个数的乘积等于B,小黑迫不及待地想去计算出这两个数的最大公约数,这次你能帮帮他吗?如果结果超过了9位数,输出最后的9位数。 Input第一行包含一个正原创 2012-09-17 20:39:12 · 885 阅读 · 0 评论 -
hdu 1005 矩阵相乘求解
矩阵乘法:我们将数列写成:Fibonacci[0] = 0,Fibonacci[1] = 1Fibonacci[n] = Fibonacci[n-1] + Fibonacci[n-2] (n >= 2)可以将它写成矩阵乘法形式: 将右边连续的展开就得到:原创 2012-09-18 09:57:08 · 1158 阅读 · 0 评论 -
hdu1695 GCD (容斥原理+欧拉函数)
/*第一个区间:[1,2,...,b/k] 第二个区间:[b/k+1,b/k+2,...,d/k]读第一个区间我们只要利用欧拉函数雷家没个数的质因数的个数即可,第二个区间我们任取x,要求[1,2,...,b/k]中所有与x互质的数的个数,这里我们用到容斥原理:先将x质因数分解,求得[1,2,...,b/k] 里所有能被x的质因数整除的数的个数,然后用b/k减去即可。 */ #inc原创 2012-10-08 14:56:44 · 1988 阅读 · 0 评论 -
hdu 1143
DescriptionIn how many ways can you tile a 3xn rectangle with 2x1 dominoes? Here is a sample tiling of a 3x12 rectangle. InputInput consists of several test cases followed by a line containing原创 2012-09-20 10:31:17 · 1451 阅读 · 0 评论 -
coj 1053 寂寞的素数 (费马小定理 + 矩阵求斐波那契)
DescriptionFibonacci 数列是大家的老朋友了 Fib[1]=1, Fib[2]=1, Fib[3]=2……Fib[n]= Fib[n-1]+ Fib[n-2] p是一个不甘寂寞的素数。某日它找到Fibonacci 数列,跳到Fibonacci 数列头上玩了起一个传说中的游戏。于是我们看到: Fib[a]^p+ Fib[a+1]^p+ Fib[a+2]^p………..原创 2012-09-20 10:53:31 · 2558 阅读 · 0 评论 -
最长公共子序列 HDU 1159/1080/1503
hdu 1159 题意:求两个串的最长公共子序列#include#include#include#define size 1000using namespace std;char str1[size],str2[size];int dp[size][size];int main(){ int len1,len2; while(scanf("%s",str1)原创 2012-10-30 21:00:37 · 859 阅读 · 0 评论 -
BUY LOW, BUT LOWER
“逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀:"逢低吸纳,越低越买"这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。原创 2012-08-05 15:26:04 · 587 阅读 · 0 评论 -
滚动数组
昨晚做了一道题,开了一个int [5000][5000]的数组,OLE了,虽然可以用short [5000][5000]猥琐过,但毕竟只是特殊情况 正确的方法是滚动数组压缩存储,整理了一下网上的资料: 利用滚动数组的话在N很大的情况下可以达到压缩存储的作用。不过经常还是用在DP题目中,因为DP题目是一个自下而上的扩展过程,我们常常用到是连续的解,前面的解往往舍弃!所转载 2012-11-03 13:18:23 · 805 阅读 · 0 评论 -
hdu 3576 Elevators in Jiayuan Students' Apartment(DP)
tup[ f ][ i ] [ j ] [ k ]表示 第f层第一个电梯i个人,第二个电梯j个人,第三个电梯k个人的情况下要停几次。#include#include#define INF 0x7fffffffusing namespace std;int hash[20];int tup[20][20][20][20];int v , n;int dp(){ tup[原创 2012-09-14 09:40:33 · 973 阅读 · 0 评论 -
hdu 3032 Nim or not Nim? (SG打表找规律)
题意:有n堆石子,alice先取,每次可以选择拿走一堆石子中的1~x(该堆石子总数) ,也可以选择将这堆石子分成任意的两堆。alice与bob轮流取,取走最后一个石子的人胜利。思路:因为数的范围比较大,所以最好通过SG打表的结果找出规律在解。sg(4k)=4k-1;sg(4k+1)=4k+1;sg(4k+2)=4k+2;sg(4k+3)=4k+4;SG打表代码:原创 2012-09-13 19:28:54 · 1346 阅读 · 0 评论 -
POJ 3318 两个大矩阵相乘是否与另一矩阵结果相等
关于八月POJ月赛的problem B(3381)的解题总结一、 题目要求给定三个矩阵:A、B和C,判断A*B是否等于C。二、 分析题目很直观,就是矩阵乘法,但是两个矩阵直接相乘需要O(n^3)的时间复杂度,假设A*B的结果存放在AB矩阵中,实例代码如下:for(int i=0;i for(int j=0;j {转载 2012-09-14 15:18:56 · 2562 阅读 · 0 评论 -
ccsu1359 木棒相交 (叉积线段判交,并查集判断是否属于同一个集合)
题意:判断n条木棒中木棒a是否与木棒b相交。其中木棒的相交具有传递性。 首先用一个判断线段是否相交的函数判断相交: struct Point{ double x; double y;};typedef struct Point point;Const int easp=1e-9;//叉积double multi(point p0, point原创 2012-03-07 20:33:54 · 887 阅读 · 0 评论 -
poj 1523 SPF (无向图 求割项)
题意: 求有多少个割项,且每个割项被几个块所共有。代码:#include#include#include#define mm 1010using namespace std;vector vec[mm];int stack[mm] , low[mm] , dfn[mm] ,gd[mm];int top , step ,n , m ,xx;void init(){原创 2012-08-27 18:11:11 · 957 阅读 · 0 评论 -
XTU 1095 连续自然数和
之前,是想利用高斯公式直接求取(第一项最大为m/2),但是超时。 后来,看到网上一篇“另类”的求法利用hash[],觉得还不错,好不容易看懂了吧,还是超时!不过,通过这个可以知有时候利用hash[],也是一种好办法呗。 再后来,终于找到了关于该题的结题报……该题被定义为:基础模拟题。有题目可看出10000=1998+1999+2000+2001+2002;有五项,中间项为200原创 2012-03-11 11:08:46 · 629 阅读 · 0 评论 -
hdu 1686 Oulipo kmp字符串比较
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1686 模式串:p[0],p[1],p[2]…p[k]…p[j-k-1]…p[j-1],p[j]…… 若存在 : p[0],p[1]…p[k] = p[j-k-1]…p[j-1] k代表模式串下标为0~j-1的左子串中首尾字串相等字符的个数原创 2012-04-29 18:31:15 · 536 阅读 · 0 评论