随笔分类 -  Poj

摘要:题意:这个题以前见过,但是从没有用代码实现过,题意就是,给出两个杯子的容量,求是否可以通过fill,drop,pour,一系列操作,最后得出某一个容量的液体,如果可以则输出最少步数和操作过程,如果不能输出impossible分析:这题用bfs,考虑6钟转化过程,这个代码写的有点长。在输出操作过程的时候要递归。然后就是数据结构的使用了,1A了,感觉不错。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <queue> 5 u 阅读全文
posted @ 2012-09-26 10:27 pushing my way 阅读(314) 评论(0) 推荐(0)
摘要:题意:有多种汇币,汇币之间可以交换,这需要手续费,当你用100A币交换B币时,A到B的汇率是29.75,手续费是0.39,那么你可以得到(100 - 0.39) * 29.75 = 2963.3975 B币。问s币的金额经过交换最终得到的s币金额数能否增加。分析:这个题跟2240基本相似。也是利用bellman或者spfa进行松弛。细节也有不同,这个题指定了起始点。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 using namespace std 阅读全文
posted @ 2012-08-28 19:17 pushing my way 阅读(672) 评论(0) 推荐(0)
摘要:题意:给出一些不同类型的货币和货币之间兑换的比例,求能否实现从一种硬币开始到自身结束后,实现盈利分析:1.一开始遇到这个题的时候,我首先想到的是dfs,在遍历的过程中如果遇到环的话进行判断,得出结果。但是这样考虑是不正确的。比如:A 1.0 BB 1.0 CB 5.0 DC 0.1 DD 1.0 Adfs时,如果先搜ABCDA是不成功的,如果这时标记搜过的D为舍弃,则ABDA就搜不到了。2.放弃dfs后,发现这里的思路跟寻找负权回路很相似,寻找负权回路是因为在执行过程中可以不断更新,而这里如果存在盈利的话,也可以不断更新。使用bellman-ford,必须保证图中每个点为起始点都没有回路。而使 阅读全文
posted @ 2012-08-28 17:43 pushing my way 阅读(447) 评论(0) 推荐(0)
摘要:题意:给一串数列,然后求其中的各个范围内的第k大数分析:划分树,具体分析见划分树算法。跟之前做过2104相比,这道题好象没有重复的元素。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 //14256K 1813MS 7 //划分树 8 const int maxnum=100001; 9 struct tree 10 { 11 int array[ 阅读全文
posted @ 2012-08-28 17:03 pushing my way 阅读(431) 评论(0) 推荐(0)
摘要:题意:令到原队列的最少士兵出列后,使得新队列任意一个士兵都能看到左边或者右边的无穷远处。分析:题意一开始没看明白,A soldier see an extremity if there isn't any soldiers with a higher or equal height than his height between him and that extremity. 可知求的是递增序列,然后形成的序列应该是这样的:使剩下的队列满足a1 < a2 < a3 ... < a(i ) <=> a(i+1) > a(i+2) > .. a(n 阅读全文
posted @ 2012-08-27 11:54 pushing my way 阅读(406) 评论(0) 推荐(0)
摘要:题意:长度为n的01序列,没有相邻的两个1,这种序列有多少种。分析:使用递推来解决,设长度为n的没有相邻1的01序列总数为f[n]。假设序列中最后一个元素为0,则前面n-1个元素只要本身满足没有相邻的两个1就可以,所以最后一个元素为0的情况有f[n-1]种;若最后一个元素为1,则倒数第二个元素必须为0,则前面n-2个元素只要本身满足没有相邻的两个1就可以,所以最后一个元素为1的情况有f[n-2]种。综合这两种情况,得到递推公式f[n]=f[n-1]+f[n-2],婓波拉契数列是一样的。代码:View Code 1 #include <iostream> 2 #include < 阅读全文
posted @ 2012-08-26 18:53 pushing my way 阅读(380) 评论(0) 推荐(0)
摘要:题意:给你一串字符,通过添加删除其中的一部分,使其变成一个回文串,并且花费最小(添加删除都有权值)分析:因为删除一个字符和添加一个字符时等价的,所以考虑最小的一种即可,设dp[i][j]表示在区间i j范围内构成回文的最小花费,则:if 当前匹配的两个字符相等,即str[i] == str[j] 那么dp[i][j] = dp[i+1][j-1]else则把左边添加删除一个右边的值或者在右边添加删除一个左边的值 ,取一个最小的即可即:dp[i][j]=min(dp[i+1][j]+cost[str[i]-'a'],dp[i][j-1]+cost[str[j]-'a 阅读全文
posted @ 2012-08-26 16:28 pushing my way 阅读(504) 评论(0) 推荐(0)
摘要:题意:给你一段字符串,让你求出在中间最少加入几个字符可以让他变成一段回文子串。分析::假设S是一段字符串,S'是S的逆串,则只需求出S与S'的最长公共子序列即可的长度即可,最后用字符串的长度减去最长公共子序列的长度即是这道题目所求的加入的字母的长度。转化为LCS问题即可。注意:1.此题二维数组会超内存,65536k=1.6*10^7(int),而二维数组2.5*10^7,显然超内存。但是用short型可以过。2.可以使用滚动数组,因为题目只要求最后结果,没有对过程深度考察,这里可以在纸上简单模拟一下DP的转移过程.确定好最少行数或者列数之后,重点就是在如何进行"滚动& 阅读全文
posted @ 2012-08-26 12:08 pushing my way 阅读(390) 评论(0) 推荐(0)
摘要:题意:两颗苹果树每一分钟会有树落下苹果,有人去接,但是来回两个树之间的次数是一定的,所以求出在最大次数时最多能接到多少苹果。分析:设dp[i][j]表示在时间i内,已经来回了j次时得到的最大苹果数目。初始化dp[1][0]=1 if(array[1]==1) dp[1][1]=1;状态转移方程:dp[i][j]=dp[i-1][j]+array[i]%2 (j==0)dp[i][j]=max(dp[i][j],dp[i-1][j-1]+(array[i]==j%2+1)); (j<=i)dp[i][j]=max(dp[i][j],dp[i-1][j]+(array[i]==j%2+1)) 阅读全文
posted @ 2012-08-26 11:02 pushing my way 阅读(258) 评论(0) 推荐(0)
摘要:题意:长篇大论就是构建正反两个图,然后将正反图中各点距离源点的最短距离相加。分析:spfa和邻接表,注意答案得用long long 存啊。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <queue> 5 using namespace std; 6 //spfa 7 //58924K 1625MS 8 const int maxnum=1000005; 9 const int maxdigit=1000000000; 阅读全文
posted @ 2012-08-24 16:02 pushing my way 阅读(155) 评论(0) 推荐(0)
摘要:题意:给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相接的一边必须是相同颜色的。分析:参考http://blog.csdn.net/lyy289065406/article/details/6647445可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点,把木棒看成边,这样相同的颜色就是同一个节点问题便转化为:给定一个图,是否存在“一笔画”经过涂中每一点,以及经过每一边一次。这样就是求图中是否存在欧拉路Euler-Path。由图论知识可以知道,无向图存在欧拉路的充要条件为:① 图是连通的;② 所有节点的度为偶数,或者有且只有两个度为奇数的节点。 阅读全文
posted @ 2012-08-24 12:49 pushing my way 阅读(708) 评论(0) 推荐(0)
摘要:题意:求从每个入度为零的点走到唯一的一个出度为零的点的所有走法中,经过次数最多的一条边被经过的次数,输入为点数和边数。例如:7 71 33 43 54 62 35 66 7ans:4Here are the four possible paths that lead to the barn: 1 3 4 6 7 1 3 5 6 7 2 3 4 6 7 2 3 5 6 76-->7 maxnum=4分析:设start_routes[i] 为入度为0的源点到节点i的路径条数, end_routes[i] 为节点i到汇点N的路径条数。首先通过toposort求出上述两个变量,然后枚举每条边(s 阅读全文
posted @ 2012-08-23 19:05 pushing my way 阅读(295) 评论(0) 推荐(0)
摘要:题意:给定一串字符(互异),再给出一个字符序列,表示一种前后关系,如abefcd,表示a<b,e<f,c<d。将开始给出的字符进行排序,使之符合这个关系序列。并按字典序输出这些符合要求的字符序列。例如:a b f ga b b f 结果是:abfgabgfagbfgabf分析:这题就是一个给定部分顺序,来确定整体顺序的拓扑排序。但一般的拓扑排序只找出一种符合要求的序列,这题要求找出所有符合要求的序列,这就有点困难,所以还得加上回溯算法。最后对求出的所有符合要求的序列进行排序输出就可以了。代码:每次写递归都TM有种向吐血的赶脚!!!View Code 1 #include &l 阅读全文
posted @ 2012-08-23 15:54 pushing my way 阅读(728) 评论(0) 推荐(0)
摘要:题意:有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。求能确定排名的牛的数目。分析:如果一头牛被x头牛打败,打败y头牛,且x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任何两头牛的胜负关系确定了,在遍历所有牛判断一下是否满足x+y=n-1,将满足这个条件的牛数目加起来就是所求解。抽象为简单的floyd传递闭包算法,在加上每个顶点的出度与入度 (出度+入度=顶点数-1,则能够确定其编号)。传递闭包的定义:G的传递闭包定义为G*=(V,E*),其中E={(i,j):图G中存在一条从i到j的路径} 阅读全文
posted @ 2012-08-23 11:31 pushing my way 阅读(1674) 评论(0) 推荐(0)
摘要:题意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。分析:用拓扑排序:1.拓扑排序可以用栈来实现,每次入栈的是入度为0的节点。1.拓扑排序的结果一般分为三种情况:1、可以判断2、有环出现了矛盾3、条件不足,不能判断.2.这道题不仅需要判断这三种情况,而且还要判断在处理第几个关系时出现前两种情况,对于本道题来说三种情况是有优先级的。前两种情况是平等的谁先出现先输出谁的相应结果,对于第三种情况是在前两种情况下都没有的前提下输出相应结果的.网上对于这道题的错误提示:1.本题顺序:a.先判有没有环,有环就直接输出不能确定 阅读全文
posted @ 2012-08-23 10:48 pushing my way 阅读(2319) 评论(0) 推荐(0)
摘要:题意:给出n个点的m条约束信息。每条信息表述为(P a b c)表示a在b北方距离c的位置,或者(V a b) 表示a在b北方1单位距离或者更远的位置。问是否可能存在符合以上m个要求的点。分析:根据题意首先我们可以确定已知条件是一个差分约束系统,建立此系统:p a b c:xb-xa=c 即:xb-xa>=c && xb-xa<=c -----> xa-xb<=-c && xb-xa<=cv a b:xb-xa>=1 ------> xa-xb<=-1.然后将差分约束系统转化成约束图。图单源最短路存在 ----&g 阅读全文
posted @ 2012-08-21 14:53 pushing my way 阅读(238) 评论(0) 推荐(0)
摘要:这个最小生成树的题比较简单,但是需要注意:Kruskal不适合稠密图中,这个题是稠密图,用kruskal800+ms,而prim400ms.还有cin和scanf的耗时差距好大啊。prim代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 //454ms 5 const int maxnum=2001; 6 const int maxdigit=(1<<30); 7 int array[maxnum][maxnum]; 8 int close[max 阅读全文
posted @ 2012-08-21 08:49 pushing my way 阅读(230) 评论(0) 推荐(0)
摘要:题意:FJ有n头牛(编号为1~n),每一头牛都有一个测验值[S, E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <= Sj and Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。分析:将[s,e]看成是而为坐标轴的横纵坐标,画出各个点,我们发现答案就是每个点左上的点的个数。将e降序,再将s升序,就可以转化成一维。例如:1 21 20 33 4,排序后为3 40 31 21 2,这样就转化成横坐标前面小于它的个数。这个题离散到大于等于1的范围内即可。难点是,对重复坐标 阅读全文
posted @ 2012-08-19 11:11 pushing my way 阅读(212) 评论(0) 推荐(0)
摘要:这个题的第二个版本:同2299_II,也是压缩到1--n范围内,找出已知序列的相对顺序,然后构建树状数组。这里也需要一个辅助的数组。代码:View Code 1 #include <iostream> 2 #include <stdio.h> 3 #include <memory.h> 4 #include <algorithm> 5 using namespace std; 6 //516k 188ms 7 const int maxnum=15001; 8 struct node 9 {10 int digit;11 int number;1 阅读全文
posted @ 2012-08-19 10:39 pushing my way 阅读(193) 评论(0) 推荐(0)
摘要:这个题做过了,今天是树状数组的另一个版本。分析:例如 9 1 0 5 4一般数据小的话,我们求每个数字前面小于等于它的个数,只需要离散到大于等于1的范围内。9: update(10),sum(10) --->11: update(2),sum(2)--->10: update(1),sum(0)--->15: update(6),sum(6)--->34: update(5),sum(5)--->3但是这个题数据范围很大,因此必须得压缩一下注意到 9在序列中第5大,1第2大,。。。。因此,将 9 1 0 5 4替换成5 2 1 4 3做树状数组是不变的然后对应的5 阅读全文
posted @ 2012-08-18 19:00 pushing my way 阅读(337) 评论(0) 推荐(0)