ZJU/PKU解题报告
文章平均质量分 73
tiaotiaoyly
懒。
展开
-
PKU 2513 Colored Sticks - Trie树+并查集+欧拉通路
题目大意:有n根棍子(n分析:题目很明确,将所有的颜色看做节点.连接两种颜色的棍子看做节点之间的连边.问是否存在一条欧拉通路.用字典树的目的是给每种颜色编号.用并查集来判断无向图是否连通.最后要做的就是统计每种颜色的出现次数了. /*PKU2513 Colored Sticks*/#include #include #include原创 2008-11-21 14:51:00 · 1328 阅读 · 0 评论 -
PKU2060 Taxi Cab Scheme - 最小路径覆盖
题目描述:出租车公司接到N(N分析:将一个订单作为有向无环图的一个节点,若订单i完成后能够赶到订单j,那么在有向图i到j之间连有向边。然后求这个有向图的最小路径覆盖。最小路径覆盖问题可以转换为二分图最大匹配问题:若节点i到节点j有连边,那么在二部图的左边节点i到右边节点j连一条边。(事实上就是原来的有向图,只是转换为二分图来考虑)最小路径覆盖数=节点数N-最大匹配数。关于这个题原创 2008-09-24 20:20:00 · 1797 阅读 · 0 评论 -
PKU3378 Crazy Thairs - 动态规划+树状数组
题目描述:给定一个长度为N的数字序列{ai},问总共有多少个长度为5的上升子序列。(ai分析:由于数字范围很大,首先将数字离散化为1~N之间的整数。原a[]数组转换为d[]数组,其中d[i]=j表示a[i]是a[]数组中第j小的数。可以用动态规划来描述这个算法:p从0到N,令i=d[p]。f[i][k]表示以数字i为结尾,长度为k的上升序列的个数。f[i][k]+=∑f[j原创 2008-09-04 20:11:00 · 1197 阅读 · 0 评论 -
PKU3321 Apple Tree - 树状数组
题目描述:苹果树上有N个节点,苹果只能长在节点上,一个节点要么有一个苹果要么没有。给出树的结构,一种操作是将某个节点的苹果栽下或长出苹果;另一种操作是询问某个节点为根的子树总共有多少苹果。分析:题目变形很厉害,不过任然可以用树状数组来解决。我们将节点重新编号,使得所有孩子节点的编号都小于父亲节点的编号,那么当询问子树总共有多少苹果时就是询问比该节点编号小的节点有多少苹果。也就是树状原创 2008-09-04 12:21:00 · 1175 阅读 · 0 评论 -
PKU1195 Mobile phones - 二维树状数组
题目描述:在一个N*N的区域内,可以在某个点增加或减少A,并动态询问一个矩形区域内的数值之和。(N分析:典型的二维树状数组的应用。以前有几篇论文讨论了如何要用二维线段树来做,相当麻烦。不过二维树状数组则十分简单。不过树状数组的应用范围很窄,如果修改题目为“可以给某个矩形区域每个点增加或减少A,并动态询问某个点的数值”那么树状数组就不行了,而线段树可以使用。/*P原创 2008-09-03 10:38:00 · 1610 阅读 · 0 评论 -
PKU3067 Japan - 树状数组
题目描述:城市被分为东西两个部分,两岸城市之间有高速公路连接。给出高速公路连接情况,判断有公路一共有多少个交点。分析:类似二部图匹配的模型。设公路左边城市为x,右边城市为y。首先按照x城市的编号从大到小将公路a[]排序。对于公路a[i]交点个数为,0到i-1之间的公路y这里是典型的树状数组的应用。要注意两个地方:第一,公路可能有很多条,数组要开到10^6;第二,求和可能原创 2008-09-02 22:51:00 · 825 阅读 · 1 评论 -
ZJU2992 Monkey Vines - 二叉树 推规律
题目描述:用方括号表示出一个完全二叉树,要使得任意一个节点的左右两边权重相等,总权重至少要多少?分析:最开始想用链表做一颗二叉树,然后对每个节点递归找左右两边的权重,取较大的一边。写着写着发现不用链表建树也行,递归本身就是一个树形结构。于是直接用递归来表示。写完后发现WA……郁闷了好半天,猜想是不是总权重等于2^Deepth,结果AC了。这样一来递归都不用,线性扫描就行原创 2008-08-07 00:56:00 · 1554 阅读 · 0 评论 -
ZJU2994 Tiling a Grid With Dominoes - 动态规划 变换矩阵
题目描述:用1×2的多米诺骨牌,拼成4×w的矩形,总共有多少种方法?分析:经典题了,貌似我做过很多系列的这种题目,终于开窍了~/*ZJU2994 Tiling a Grid With Dominoes*/#include #include #define N 100 #define L 20 #define clr(a) memset原创 2008-08-07 00:51:00 · 1413 阅读 · 0 评论 -
ZJU1733 Common Subsequence - 最长公共子序列
题目描述:给出两个字符串,求两个字符串的最长公共子序列的长度。 分析:经典的动态规划题目。设字符串为s,t。f[i][j]表示s前i个字母和t前j个字母组成的最长公共子序列长度。状态转移方程:f[i][j] = f[i-1][j-1]+1 (s[i]==t[j])f[i][j] = max{ f[i-1][j] , f[i][j-1] }/*ZJU1733 C原创 2008-07-26 17:51:00 · 750 阅读 · 0 评论 -
ZJU2124 Perfect Pth Powers - 简单题 pow函数
题目描述:给出一个int范围的整数x,求x=b^p的最大p值。分析:因为x在int范围内,所以p的取值是1到31。枚举一下,用pow函数对x开方,然后验证即可。错了好几次……原因是数据可能是2^31,并且里面有负数,但是题目明明说“The value of x will have magnitude at least 2 and be within the range of a原创 2008-07-27 01:11:00 · 983 阅读 · 0 评论 -
ZJU1161 Gone Fishing - 动态规划
题目描述:一个人去n个湖钓鱼,第i个湖里初始时一个单位时间可以钓fi条鱼,下一个单位时间钓的鱼数量递减di。湖的排列是线性的,从第i个湖走到第i+1个湖需要ti的时间。现在有m时间可用,初始在第一个湖,问最多可以钓多少鱼。分析:很明显题目条件满足无后效性,可以用动态规划来解决。设dp[i][j]表示在前i个湖花费j的时间最多钓鱼数量(并停留在第i个湖)。getFish(i,t)表原创 2008-07-26 23:23:00 · 1038 阅读 · 0 评论 -
ZJU1346 Comparing Your Heroes - 拓扑排序的计数★
题目描述:某人要对拳皇的人物做一个排序。输入一个N,接下来N行每行两个字符串A B,表示A比B厉害。要求一共有多少种不同的拓扑排序方法。若不能完成排序输出0。 分析:可以用动态规划来解决。对于n个节点进行拓扑排序,设当前有m个度为0的节点,记为Zi。所以当前可以选择这m个度为0的节点中的任意一个排在前面,剩下的节点有多少种排序方法与之前无关。所以可以用节点集合表示状态。状态原创 2008-07-26 00:43:00 · 4651 阅读 · 0 评论 -
ZJU1234 Chopsticks - 动态规划
题目描述:有一个人发明了一种新的用筷子的方法,每次用三根筷子,筷子长度不一(A分析:这个动态规划的变形比较奇怪,三个筷子的长度,最长那根是没有用的,但是必须要有。数组a[i]表示第i根筷子的长度,按照非升序排列,下标从1开始。用状态f[i][j]表示从前i根筷子选出j副,得到的最小不合适度。可以证明,若用选第a[i]根筷子作为最短的,那么次短的筷子必然是a[i-1]。所以记b原创 2008-07-26 15:58:00 · 1226 阅读 · 0 评论 -
ZJU1607 Varacious Steve - 博弈&动态规划★
题目描述:游戏者AB分享N个面包圈,由A开始轮流取面包,每次不超过M个。当某人取得最后一个面包圈时为胜利者。胜利者可以吃掉已经取得的面包圈,失败者将自己取得的面包圈拿出来重新开始游戏,并由失败者开始取。假设AB两人都使用最佳决策,问A最多能吃到多少面包圈。 题目分析:想了好久,DP思路还是不清晰,在网上搜了一下才豁然开朗。不过网上那个公式比较冗余,我把他的公式降了一维下来。设f原创 2008-07-23 22:19:00 · 1920 阅读 · 0 评论 -
ZJU2100 Seeding - 哈密尔顿通路 深度优先搜索
题目描述:在n*m的格子中,某些格子不能通过。现在从左上角的格子出发,每个格子只经过一次,问能否遍历所有的格子。(m,n分析:很郁闷的是,一开始的时候以为是欧拉通路的问题。后来发现不是,而是典型的哈密尔顿通路……我还天真的想,能否通过某种方式转换一下,使原来的节点拆为变来处理。只能是无果而终,因为要是能转换的话,哈密尔顿通路问题也就能转换为欧拉通路问题得到高效的解决,而事实上是im原创 2008-07-16 00:25:00 · 1647 阅读 · 0 评论 -
ZJU2103 Marco Popo the Traveler - 欧拉图 深度优先搜索
题目大意:n个城市之间有h条道路(n分析:典型的欧拉通路问题,即一笔画问题。用深度优先搜索就好。要注意的是需要考虑道路不连通的情况。 /*ZJU2103 Marco Popo the Traveler*/#include #include #define clr(a) memset(a,0,sizeof(a))#define N 15#define H 25原创 2008-07-16 01:14:00 · 953 阅读 · 0 评论 -
PKU2516 Minimum Cost - 最小费用最大流
模板题,整理代码…… /*PKU2516 Minimum Cost*/#include #include #define clr(a) memset(a,0,sizeof(a)) #define N 200 #define INF (1int DualityEdmondsKarp(int g[][N],int w[][N],int n原创 2008-09-26 21:08:00 · 971 阅读 · 0 评论 -
ZJU 1990 Subway tree systems - 树的最小表示
题目大意:初始时站在树的根节点,若朝着远离根的方向走,记录“0”,接近根的方向走记录“1”。并且树的每一条边只能来回走一次(即向下和返回)。一个合法的01序列可以描述出一棵树的形态。现在给出两个合法的01序列,判断两棵树是否同构。分析:由于根节点确定,若两棵树同构,无非就是把子树的位置交换了一下。很自然的想法就是:将树的子树按照某种规则进行排序,若排序之后两个字符串相等,则同构;否则不原创 2008-10-17 17:23:00 · 2804 阅读 · 0 评论 -
ZJU 2604 Little Brackets - 动态规划 Catalan数变形
题目描述:定义一个括号序列的Depth为最深的嵌套层数。问n对括号,depth为k的括号序列共有多少种。分析:很类似Catalan数的题目。回忆经典的Catalan数:f[n]表示n对括号能够组成多少种不同的序列。那么可以得出f[n]的递推式:f[n]=∑f[i]*f[n-i-1](0对于此题可以用类似的思路得到递推式。设f[i][j]表示i对括号能组成多少个depth为j原创 2008-10-16 20:42:00 · 1648 阅读 · 0 评论 -
PKU 3041 Asteroids - 行列的二分图模型 最小点覆盖
题目大意:N*N的空间中有K个小行星,使用超级武器可以一次性清理一行或一列的所有小行星.但是超级武器很贵,给出星空图,问最少需要使用多少次武器能清除所有的小行星.N分析:很经典的行列模型转换为二分图模型来处理的题目,ZJU1002和PKU2226也是可以这样转换.将行和列分别作为二分图左边和右边的节点.若在地图(i,j)上有一颗小行星,那么二分图左边i节点和右边j节点之间连一条边.原创 2008-11-21 22:37:00 · 1677 阅读 · 0 评论 -
PKU 2942 Knights of the Round Table - 无向图的块 判断奇圈
题目大意:N个骑士某些骑士之间会有仇恨。骑士们开会时围坐在一个圆桌旁。一次会议能够举行,当且仅当没有相邻的两个骑士相互仇恨,且开会人数为大于2的奇数。若某个骑士任何会议都不能参加,那么就必须将它踢出。给出骑士之间的仇恨关系,问需要踢出多少个骑士。分析:首先,求出无向图的块(即同一个块中没有割点)。块中的节点一定是可以组成环的。可以证明,若块中存在一个奇圈,那么块中所有顶点都在一个奇原创 2008-11-15 21:05:00 · 2050 阅读 · 0 评论 -
PKU 3177 Redundant Paths - 无向图的双连通分量和桥
题目大意:给出一个无向连通图,判断最少需要加多少条边,才能使得任意两点之间至少有两条相互"边独立"的道路.注意,可能含有重边.分析:显然,在同一个双连通分量里的所有点可以等价地看做一个点.收缩后,新图是一棵树,树的边是原无向图的桥.现在问题转化为了在树中至少添加多少条边能使图变为双连通图.结论是: 添加边数 = (树中度为1的节点数+1) / 2说点题外话,无向图的双连通分原创 2008-11-15 18:20:00 · 2076 阅读 · 0 评论 -
PKU 1659 Frogs' Neighborhood - 贪心 Havel定理
题目大意:给出一个无向图的顶点度序列{dn},要求判断能否构造出一个简单无向图。若能构造任意一个输出邻接矩阵。分析:今年哈尔滨赛区也出了一个一样的题目,而且只要求判定不需要构造。当时我们是用贪心做的,只是到最后也不知道为什么是正确的……贪心的方法是每次把顶点按度大小从大到小排序,取出度最大的点Vi,依次和度较大的那些顶点Vj连接,同时减去Vj的度。连接完之后就不再考虑Vi了,剩下的原创 2008-11-13 19:02:00 · 1189 阅读 · 2 评论 -
PKU 2762 Going from u to v or from v to u? - 单连通图判定
题目大意:给出一个有向图n个顶点m条边,判断是否能任意选择两个点u,v,都至少存在一条通路从u到达v或v到达u,也就是u,v之间存在单向的通路。分析:首先将有向图的极大强连通分量收缩成一个点,构成新的有向无环图G。现在要判断新图G是一个单连通图。即每对顶点u,v存在u->v或v->u或两者都存在。这个条件看起来很面熟,貌似竞赛图就是满足这样条件的图。竞赛图有一个性质,竞赛图必然原创 2008-11-13 16:54:00 · 1727 阅读 · 0 评论 -
PKU 3678 Katu Puzzle - 2-SAT判定
题目大意:n个布尔变量Xi,现在有m个约束条件,给出Xi op Xj = c,给出每个i j c 和 op。其中op可能是AND,OR,XOR。要求这n个布尔变量是否存在一组可能的取值,使得满足所有的约束条件。分析:题目可以转换为一个2-SAT问题。首先将每个布尔变量拆成取值为0和取值为1两个节点。给出的约束条件可以这样确定:Xi op Xj = c,那么Xi&Xj取值不等于c的那些取原创 2008-11-12 18:28:00 · 1173 阅读 · 0 评论 -
PKU 1236 Network of Schools - 最小点基
题目大意:N个高校之间有一些单向的网络链接(N分析:我们先来讨论问题A。这个问题在吴文虎的OI图论书上有介绍过,叫做有向图的最小点基。首先,求出有向图的极大强连通分量,在同一个强连通分量里的学校任意一个收到软件,整个强连通分量里的学校都可以收到。将每个强连通分量缩成一个点,构成一个新的有向无环图。当强连通分量i收到软件,那么i可达的强连通分量都可以收到软件。我们称入度为0的强连原创 2008-11-12 14:44:00 · 2405 阅读 · 4 评论 -
ZJU 2588 Burning Bridges - 无向图的桥
题目大意:给出一个无向图,N个顶点M条边(N分析:题目就是要求无向图的桥。至于重边的处理,只要顶点ij之间有重边,那么这些重边任何一条都不可能是桥。由于数据量大,需要用邻接表来存无向图。PE了无数次>_ /*ZJU2588 Burning Bridges*/#include #include #define clr(a) mems原创 2008-11-12 17:02:00 · 1935 阅读 · 0 评论 -
PKU 2553 The Bottom of a Graph - 极大强连通分量
PKU2553 ZJU1979 The Bottom of a Graph题目描述:给出一个有向图,定义:若节点v所有能到达的点{wi},都能反过来到达v,那么称节点v是sink。题目要求所有的sink点。分析:很类似这样一个题,足球队队员之间某些人可以联系到另一些人,问教练至少要通知多少个队员,可以让所有队员都收到训练通知。这个经典题目在吴文虎的图论书里面有讲解,就是求有向图原创 2008-11-05 21:53:00 · 1500 阅读 · 0 评论 -
PKU 3261 Milk Pattern - 后缀数组+LCP
题目大意:给出长度为n的数字序列(n分析:此题可以用后缀数组的最长公共前缀LCP来解决。只是需要将字符数组换做数字数组来处理而已。下面的讨论是基于已求出后缀数组并且做好LCP的预处理的前提下进行的。如何求后缀数组以及最长公共前缀请参考2004年许智磊的IOI国家队论文《后缀数组》。论文中一个重要结论:LCP(i,j)=min{LCP(k-1,k)|i+1≤k≤j}。即,询问后缀原创 2008-11-05 23:43:00 · 3016 阅读 · 2 评论 -
ZJU 1060 Sorting It All Out - 拓扑排序
ZJU1060 PKU1094 题目大意:输入n和m,表示字母表的前n个字母,总共有m组小于关系(即A 分析:题目的意思就是要根据这些关系确定是否存在唯一的拓扑关系。一个很直接的思路就是,每输入一个关系,就对新的关系集合做一次拓扑排序,并判断是否存在环(冲突),是否有多个度为0的节点(排序不唯一),或排序唯一。只要检测到一次冲突或排序成功,之后的关系都不再处理。这原创 2008-11-05 15:53:00 · 1127 阅读 · 1 评论 -
PKU 3259 Wormholes - 判断负权回路 Bellman-Ford
题目大意:农场上有N块田地(N 倒退t!注意路径是双向的,虫洞是单向的。现在农夫John希望知道能否从某块地出发并且回到这块地,使得他回来的时间早于出发的时间(可以遇到他自己^^)。分析:褪去题目的伪装,可以看出,题目就是要求一个带负权的有向图中是否存在权值为负的回路。这个问题就是Bellman-Ford求带负权有向图的最短路径时,需要解决的问题。 /*PKU3原创 2008-11-02 21:11:00 · 1916 阅读 · 3 评论 -
ZJU 1002 Fire Net - 二分图最大匹配
题目大意:一个N*N的网格中(N分析:这是一个古老的题目了,我最开始学ACM的时候一眼就能看出来这是一个搜索题,并且也能毫不费力地写出一段搜索代码把它过掉。后来听罗老师讲了这个题之后才知道,原来还有更高效的匹配算法来解决这个问题。(按照罗老师的原话说,这个题目出题的本意就是让大家用匹配来做……>_可以这样来构造匹配模型。假设没有墙阻挡,那么把地图的行和列作为二部图的两侧顶点,i原创 2008-10-22 10:50:00 · 3307 阅读 · 1 评论 -
ZJU1311 Network - 无向图的割点
题目大意:给出一个无向图,求图中割点的个数。(若去掉顶点i及其邻边,导致剩下的图不连通,则i是割点)分析:求割点有很成熟的DFS算法,照书写了一个,整理成模板备用。 /*ZJU1311 Network*/#include #include #define clr(a) memset(a,0,sizeof(a)) #define MIN原创 2008-10-04 21:57:00 · 1284 阅读 · 0 评论 -
PKU1459 Power Network - 最大流
模板题,不说了,整理一下模板: /*PKU1459 Power Network*/#include #include #include #define clr(a) memset(a,0,sizeof(a)) #define N 200 #define INF (1int EdmondsKarp(int g[][N],原创 2008-09-26 14:36:00 · 870 阅读 · 0 评论 -
ZJU2039 The Dog Task - 二部图最大匹配
题目大意:Bob带着他的Dog外出散步,Bob速度固定且依次沿着n个点行走,分别用(Xi,Yi)表示。Dog的速度可以达到Bob的2倍。在路途中有m个地点是Dog喜欢玩耍的地方,用(Xi,Yi)表示。Dog和Bob同时从第一个点X1,Y1出发,Dog在路途中跑去玩耍,但是必须在Bob到达第二个点X2,Y2时赶回来和Bob碰面。每次离开Bob,Dog最多只能去一个地方玩耍,以前去过的地方Do原创 2008-04-28 16:23:00 · 1124 阅读 · 0 评论 -
ZJU2311 Inglish-Number Translator - 模拟 英文数字转换
题目大意:给出一个数字的英文单词,输出对应的数字。如“two hundred twenty two”表示222。分析:首先将读入的字符串转换为数字数组,例如,以上字符串就存为2,100,20,2。想了很久不知如何用一个简练的方式来处理。后来用了一个递归的方法。函数int work(int L,int R)用来求解数组a[]L到R的区间表示的数字。按次序依次在这个区间查找10原创 2008-04-24 22:34:00 · 1513 阅读 · 2 评论 -
ZJU2058 The Archaeologist's Trouble II - 贪心+构造
题目大意:一个字符三角形可能出现@ ,* ,?三种字符。三角形中只允许出现四种不同的@*的组合。?表示该字符未知。给出一个三角形,要求字符@出现最多和最少的次数分别是多少。分析:允许的字符排列有以下四种:@ @ × ×@×, ×@, ×@, @×观察发现,一个规律:三角形的字符是否合法与前一行无关。也就是说,判断这个三角形是否合法,只需一行一行判断即可。原创 2008-04-28 17:50:00 · 1037 阅读 · 0 评论 -
ZJU2033 The Jewelry Is Gone - 深搜+动态规划
题目描述:一个盗贼嵌入一间装满珠宝的仓库,仓库大小N×M (N,M分析:若抛开背包的重量限制,盗贼每个单位时间能有5种走法(4个方向和停留),最多走7步,最多的搜索量也只有5^7≈80000。我们可以考虑深度优先搜索所有可能的路径,不需要太强的剪枝也行。接下来就是要处理,当盗贼的某条路径搜索完毕时,如何判断当前路径上最多能获得多少钻石?显然是典型的01背包问题。我试了一原创 2008-02-13 00:21:00 · 857 阅读 · 0 评论 -
ZJU2031 Song List - 广度优先搜索
题目描述:一个歌曲列表,你可以有3种操作:1,选择上一首;2,选择下一首;3,改变排序方式。改变排序方式后,当前选中的歌曲不变。初始时按照Title排序,也可在Author排序之间切换。问从指定某首歌开始,最少需要多少操作能选中指定的另一首歌。分析:又是一个AC人数很少的题~如果能想到是广度优先搜索就能做出来。还是考察基本功。没什么好写的~ 发个帖子纪念一下~:) 贴一下代原创 2008-02-13 03:56:00 · 764 阅读 · 2 评论 -
ZJU2034 False Coin - 称硬币问题
题目描述:古老的称硬币问题。现有一堆硬币依次编号1-N(N分析:1,若两堆硬币重量相等,则所有的硬币都是正常的硬币。从未出现在重量相等情况下的硬币有嫌疑。2,若某些硬币每次都出现在重量较小或较大的一边,则此硬币有嫌疑;否则一定正常。3,综合以上两点,找出所有有嫌疑的硬币。若为0或者大于1个,则找不到;否则输出该硬币。其实说起来思路很清晰,只需按照生活经验来推断即可。说说原创 2008-02-13 02:49:00 · 1129 阅读 · 0 评论