ACM
ACM竞赛
水落
这个作者很懒,什么都没留下…
展开
-
hdu 5071 Chat (模拟题)
题目很长,但理解清楚就很好做了。有两个值得注意的地方: * 最后输出Bye的时候每次只输出当前的top。所以一开始若有Always on top,就要首先输出。 * 再输出Bye的时候,若是一句话也没讲,就不用输出代码#include <iostream>#include <string>#include <map>#include <vector>using namespace std;原创 2015-11-08 21:31:12 · 361 阅读 · 0 评论 -
HDU 5533 Dancing Stars on Me(凸包)
题目大意给出n个点,判断这n个点能否构成一个等边的严格凸包分析首先直接求凸包,判断是不是n个点全部用到了。再依次比较每条边是否相等。代码#include <iostream>#include <cmath>#include <algorithm>using namespace std;const int maxn = 110;struct point { int x , y原创 2015-11-04 16:30:19 · 351 阅读 · 0 评论 -
HDU 2202 最大三角形 (凸包+旋转卡壳)
题目大意给出n(3 <= n <= 50000)个点,求这n个中最大三角形的面积分析暴力求解O(n^3),妥妥超时很容易想明白,最大三角形必定存在在这n个点构成的最大严格凸包中。所以先求凸包,时间复杂度O(nlogn)然后用旋转卡壳法在这个凸包中求最大三角形面积。时间复杂度O(m^2)(m为凸包中的点的数量)代码#include <iostream>#include <algorith原创 2015-11-07 13:47:19 · 759 阅读 · 0 评论 -
匈牙利算法详解
转自:http://blog.csdn.net/dark_scope/article/details/8880547【书本上的算法往往讲得非常复杂,我和我的朋友计划用一些简单通俗的例子来描述算法的流程】匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名。匈牙利算法是基于Hall定理中充分性证明的思想,它是部图匹配最常见的算法,该算法的核心就是寻找增广路径转载 2015-10-28 20:23:24 · 399 阅读 · 0 评论 -
POJ 2240 Arbitrage (Floyd)
题目大意给出n种货币,以及m种对换方式的兑换率。求通过兑换能否使钱增加。分析dis[i][j]表示货币i兑换货币j的最大兑换率。求出所有货币的之间的最大兑换率。最后查看dis[i][j] * dis[j][i] 是否大于1即可。初始化dis[i][j] = (i == j ? 1 : 0);直接使用Floyd算法即可代码#include <iostream>#include <stri原创 2015-10-25 16:43:05 · 307 阅读 · 0 评论 -
POJ 2253 Frogger(floyd 或 dijstra)
题目大意出个n个点的坐标,任意两个点都是互相可到达的。求第0点到第1点的所有路径中,长度最大的边的最小值。Floyd算法求解Floyd是求图中任意两个点的最短路,即dis[i][j]表示i到达j的最短距离。这里稍作变换,令dis[i][j]表示i到达j的所有路径中长度最大的边的最小值。则if(dis[i][j] > max(dis[i][k] , dis[j][k])) dis原创 2015-10-25 14:31:24 · 332 阅读 · 0 评论 -
POJ 3041 Asteroids (匈牙利算法)
题目大意给出n*n的矩形,k个点。每次可选择删除一行或一列的点,求至少需要删除几次方可将点全部删除。分析构造有向二分图:把每行x或者每列y看成一个点,而障碍物(x,y)可以看做连接x和y的边。问题就转化成为选择最少的一些点(x或y),使得从这些点与所有的边相邻,其实这就是最小点覆盖问题。Konig定理: 最小点覆盖数 = 最大匹配数用匈牙利算法求二分图的最大匹配即可代码#include原创 2015-10-28 20:48:18 · 340 阅读 · 0 评论 -
POJ 1094 Sorting It All Out (拓扑排序)
题目大意给出一个数n,表示有n的大写字母,从A开始。然后给出m个字符串,均是X < Y的格式,其中X,Y均是单个的大写字母。问根据这m个字符串得到前n个字母的关系:全序,有环,偏序按以下三种格式输出:Sorted sequence determined after **i** relations: **XXXX**.Inconsistency found after **i** relati原创 2015-10-26 22:38:39 · 319 阅读 · 0 评论 -
POJ 3259 Wormholes (Bellman-ford)
题目大意给出n个点,m条边以及w个虫洞。每条边都是双向的,并且有一个权值v表示通过这条边需要花费秒。每个虫洞是单向的且有一个权值v表示通过这个虫洞可以回到v秒之前。求最终到达起点时,所花费时间相对于起始时间是否为负分析判断是否存在负环即可#include <iostream>#include <vector>using namespace std;#define INF 0x3ffff原创 2015-10-24 17:21:39 · 317 阅读 · 0 评论 -
POJ 1125 Stockbroker Grapevine (Floyd)
题目大意给出n个经纪人,接下来的n行,每行的第一个数m代表该经纪人的朋友数。紧接着有m对数,第一数代表朋友编号,第二个表示将消息传给该朋友所需时间。求从某个人开始,将消息传送到所有人所需花费的最少时间。分析很明显,要求出任意两点的最短路径,用Floyd算法。然后遍历结果数组dis,求出每一行的最大值的最小值即可。代码#include <iostream>using namespace s原创 2015-10-25 15:58:49 · 373 阅读 · 0 评论 -
POJ 3026 Borg Maze (Prim)
题目大意给出m行n列的矩阵,所有元素均为’#’,’ ‘, ‘A’ ,’S’。其中#代表墙,即不可通过,’ ’ 则代表路。要求从S出发到达所有A的道路长度。分析所有字母都作为结点,字母之间的距离作为边,构造图。首先用BFS找出每个节点到其他点的距离,从而得到边然后直接prim求解代码/* 所有字母都作为结点,字母之间的距离作为边,构造图 * 首先用BFS找出每个节点到其他点的距离,从而构原创 2015-10-25 22:38:56 · 337 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼 (dijkstra)
题目大意有n个物品,编号为1…n,每个物品都有三个属性P、L、X(X < N),分别表示物品的价格,等级,替代品数量(即使用其它物品来替代该物品后,只需付出那个物品的价格和替代后的优惠价格即可得到该物品)。给定m,表示物品之间相差等级不能超过m。假设3个物品,m=1,等级依次为1,2,3。可以用2替代1,却不能使用3替代2,因为1,3之间等级超过m。求得到物品1的至少需要付出的金币数量分析原创 2015-10-24 21:06:42 · 377 阅读 · 0 评论 -
POJ 1789 Truck History (Prim)
题目大意给出n个长度为7的串,串之间的dis为两个串中不同字母的个数,任何一个串都是可以由其它串得到,代价是两个串的dis求将所有串转换成同一个串的最少代价分析以串作为结点,串之间的代价作为边,建图。然后就是直接求最小生成树代码#include <iostream>#include <string>#include <cstring>using namespace std;#def原创 2015-10-25 20:12:31 · 282 阅读 · 0 评论 -
POJ 1860 Currency Exchange(Bellman-Ford)
题目大意给出n个顶点,m条边,原点s及初始金钱v。每条边有6个参数from, to, c1, r1, c2, r2。假设在from出有v的金钱,从from -> to,金钱 = (v - c1) * r1; 假设在to出有v的金钱,从to -> from,金钱 = (v - c2) * r2;求从s出发,最终回到s时金钱能否增长分析把每条双向边改写成两条单向边。只需用Bellman-F原创 2015-10-24 16:03:52 · 319 阅读 · 0 评论 -
Bellman-Ford算法详讲
概要Dijkstra算法是处理单源最短路径的有效算法,但它局限于边的权值非负的情况,若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的。所以就需要使用其他的算法来求解最短路径,Bellman-Ford算法就是其中最常用的一个,时间复杂度O(VE)。spfa是在Bellman-Ford上的队列优化,时间复杂度O(kE) (k << V),但在最坏的情况下,有可能退化转载 2015-10-24 15:54:51 · 480 阅读 · 0 评论 -
HDU 5591 ZYB's Game
题目大意两个人玩游戏,都已知数X,在[1,N]中猜中X则算输。若没猜中,则缩小范围。假设两人都足够聪明,求对于任意的X属于[1,N],能使得后手赢的X有多少个。分析类似两堆石子,每堆石子若干个,两个人可在任意一堆石子中捡取若干个,最后一个捡完石子的人胜利。若要使得后手能够胜利,则必然是先手面临两堆石子数量相等的情况。 若两堆石子数量相等,则后手可捡取先手所捡取得同样数量的石子。从而立原创 2015-12-05 23:30:57 · 884 阅读 · 0 评论 -
POJ 1054 The Troublesome Frog
题目大意给你一块m*n的矩阵,以及num个点的坐标,含有点的数量最多的直线所含有的点的数量。要求:直线上的点间距要相等,不足3个点的记为0。若前k个点在矩阵内,第k+1个点的坐标也在矩阵内,但矩阵中不存在该点,则此直线无效。分析先对坐标按x排序,若x相等,则按y排序枚举每条直线上的**前两个点**s1 ,s2即可。计算出步长lenx = s2.x - s1.x , leny = s2.y原创 2015-10-10 20:48:24 · 487 阅读 · 0 评论 -
POJ 1836 Alignment (简单DP)
题目大意给出n个浮点数(2 <= n <= 1000 , 0.5 <= 浮点数 <=2.5),然后求一段序列长度ans,要求这个序列中从左到右递增,或者从右到左递增。输出n - ans分析求最长上升子序列和最长下降子序列的长度dp1[i]表示以i结尾的最长上升子序列的长度dp2[i]表示以i结尾的最长下降子序列的长度然后枚举两段区间[0,i] [j,n-1]时间复杂度O(n^2)代原创 2015-10-07 16:34:01 · 279 阅读 · 0 评论 -
POJ 1159 Palindrome (LCS)
题目大意给出一个字符串s,求至少添加几个字符使之成为一个回文串分析求出s与s的逆序s’的最长公共子序列的长度d,然后len - d即可dp[i][j]表示s串种1…i和n…n-j的最长公共子序列的长度状态转移方程若s[i] = s[j],则dp[i][j] = dp[i-1][j-1] + 1 否则,dp[i][j] = max(dp[i][j-1] , dp[i-1][j])由于s长度原创 2015-10-08 18:51:07 · 329 阅读 · 0 评论 -
POJ 1837 Balance (简单DP)
题目大意一架天平,天平上有m个钩子,有n个砝码(2 <= c <= 20,2 <= G <= 20),天平的坐标范围为[-15,15]。给出m个钩子的坐标c[i](-15<=c<=15),以及n个砝码的重量g[j](1 <= g <= 25),要求所有砝码都要用到,求最终平衡的方案数分析dp[i][j] 表示对于前i个砝码,在平衡度为j时的方案数最大平衡度maxn = 15 * 20 *原创 2015-10-05 14:06:50 · 479 阅读 · 0 评论 -
hdu 5074 Hatsune Miku (动态规划)
题目大意给出m种音符,编号为1…m,以及一个m*m的矩阵s。s[i][j]表示音符j出现在i之后时,ij这个组合能得到的分数。n个数,每个数num[i]代表一种音符。-1则是可以用任何音符替换,正数则是num[i]本身。求能得到的最大分数分析dp[i][j]表示对于前i个音符,第i个音符用j替换时能得到的最大分数i和i+1都是-1时dp[i+1][k] = max(dp[i+1][k],原创 2015-11-08 21:46:18 · 509 阅读 · 0 评论 -
POJ 1260 Pearls (简单DP)
题目大意给出n类珠子,以及每类珠子的数量num[i]和单价val[i]。单价从小到大排序,买每一类珠子的价格是(num[i]+10)*val[i]。问买sum(num[i])的珠子,所需最少花费。其中,价格较低的珠子可有价格高的珠子替代,反之不行。分析很容易看出,珠子是不能跳跃替代的。比如说,若用第3类珠子替代第1类珠子时,则第2类珠子也要由第3类珠子替代。否则,用第2类珠子替代第1类珠子更原创 2015-10-08 12:10:49 · 446 阅读 · 0 评论 -
POJ 1191 棋盘分割 (DP)
题目大意输入一个8*8的矩阵,将其分解成n个矩阵,使各矩阵总分的均方差最小。均方差,其中平均值,xi为第i块矩形棋盘的总分。 分析将方差公式化简成s^2 = (x1^2+…+xn^2) / n - x^2,x为平均值dp[i][x1][y1][x2][y2]表示对于(x1,y1)(x2,y2)的矩阵,第i次分割后得到的平方和的最小值sum[x1][y1][x2][y2]表示矩形(x1,y原创 2015-10-09 18:31:37 · 315 阅读 · 0 评论 -
ZOJ 2319 Beautiful People (LIS的变形)
题目大意有n个人的,每个人有一个si和bi,对于i和j来说,只有当si < sj && bi < bj ,或者 si > sj && bi > bj 时,二人才不会互相讨厌。也就是说,只有两个人其中一方的s和b都小于另一方时,二人才不会互相讨厌。求最多有多少人不会互相讨厌分析给n个人按s排序从小到大,若s相等则按b从大到小排序。然后求b的最长上升子序列的长度ans即可用O(nlogn)原创 2015-10-08 20:06:59 · 420 阅读 · 0 评论 -
POJ 1080 Human Gene Functions (类似LCS)
题目大意题目给出一张5*5的映射表,分别是ACGT-,每对字符都有一个相似值。给出两个字符串,由ACGT组成,求两个字符串匹配的最大相似值和,可以用-代替字符匹配。分析类似求最长公共子序列dp[i][j]表示s1中1….i和s2中的1….j匹配的最大相似值状态转移方程dp[i][j] = max{dp[i-1][j-1]+mp[a][b] , dp[i-1][j]+mp[a][4] ,原创 2015-10-08 16:21:19 · 257 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence (LIS)
求最长上升子序列的长度O(n^2)的算法dp[i]表示以i结尾最长上升子序列的长度状态转移方程:dp[i] = max(d[j])+1,j代码//时间复杂度O(n^2)的算法#include <iostream>using namespace std;const int maxn = 1010;int dp[maxn]; //dp[i]表示以i结尾最长上升子序列的长度int a[maxn原创 2015-10-08 13:02:01 · 280 阅读 · 0 评论 -
POJ 1276 Cash Machine (多重背包)
题目大意给定cash,N,表示有cash现金,N种账单。每种账单的额度为D[i],数目为n[i],求在不超过cash的前提下,最多能兑换到到少money。分析对于每种额度的账单,可选择k张(0 , 1 , … , n[i]),很明显的多重背包问题。状态:dp[j]表示在剩余j的现金下,前i种账单最多能兑换到的money状态转移方程: dp[j] = max(dp[j] , dp[j-D[i原创 2015-10-03 15:48:18 · 273 阅读 · 0 评论 -
POJ 3267 The Cow Lexicon (简单DP)
题目大意输入一个长度为m的文本串,n个模板。求在文本串中至少去掉几个字母可以完全匹配模板。(2<= m1<= 300, ≤ n ≤ 600,模板串长度 ≤ 25),全部由小写字母组成。分析dp[i]表示以i结尾的子串至少需要去掉字符数状态转移方程: dp[i] = min(dp[i] , tmp+dp[j]),其中tmp为匹配模板需要去掉的字符数,j是匹配完后的位置。初始化dp[i] = d原创 2015-10-05 16:57:25 · 327 阅读 · 0 评论 -
POJ 1163 The Triangle (数塔)
题目大意一个n层的数塔,从第一层走到最后一层,沿途经过的数的最大值分析dp[i][j]表示到达(i , j)时的最大值状态转方程dp[i][j] = max(dp[i-1][j-1] , dp[i-1][j]) + a[i][j];代码#include <iostream>#include <cstring>using namespace std;const int maxn = 360原创 2015-10-08 14:05:09 · 284 阅读 · 0 评论 -
ZOJ 3328 Searching the String (AC自动机)
题目大意输入一个文本串和若干模板串。统计每个模板串在文本串中出现的次数。模板串有0和1两种类型,0型在文本串中可以重叠,1型的不可以重叠。分析把所有模板串建成一个AC自动机求出字典树上所有串以0型和1型在文本串种出现的次数,即cnt[i][j]表示根节点到节点i的串在文本串中以类型j出现的次数wordend[i]表示第i个模板串的在字典树的最后一个节点所以 ans[i] = cnt[w原创 2015-09-22 19:58:54 · 268 阅读 · 0 评论 -
POJ 2778 DNA Sequence (AC自动机+矩阵快速幂)
题目大意有m个字符串,求所有长度为n的字符串中,不包含这m个串的个数。这些串全部以A,C,G,T组成。分析把m个串构造成AC自动机然后用M[i][j]表示结点i到结点j只走1步,可行的方法数。那么矩阵M的n次方则代表i到j走n步的可行方法数。由于n最大为20亿,所以用矩阵的快速幂AC自动机上面例子是{AGC,C}构造成的AC自动机,红线是失败指针,蓝线是状态之间的转移。例如,从状态0出发走原创 2015-09-23 23:25:12 · 381 阅读 · 0 评论 -
POJ 1625 Censored! (AC自动机+DP+大数加法)
题目大意给出包含N个字符的字典,组成长度为M的句子,求无禁止单词的句子有多少个。禁止单词有P个,单词长度不超过10,所以字符的ASCII码均大于32(1 <= N <= 50, 1 <= M <= 50, 0 <= P <= 10)。分析状态dp[i][j]表示第i步时,到达状态j的字符串数,途中不能经过危险结点则状态转移方程为dp[i][j] = sum(dp[i-1][k]),其中j是k原创 2015-10-14 22:53:43 · 379 阅读 · 0 评论 -
HDU 2243 考研路茫茫——单词情结 (AC自动机+矩阵快速幂求和)
题目大意给出n个模板,求长度小于等于m的字符串中有多少个包含这n个模板中至少一个,所有字符串均是小写字母组成,答案对2^64取模。分析对2^64取模,用unsiged __int64 即可实现自动取模转化为 总的数量-不包含模板的数量建立AC自动机,构造矩阵M,M[i][j]表示节点i走到节点j只走一步的方法数,从而 ans = (26 + 26^2 + ... + 26^m) - (M原创 2015-09-24 20:02:00 · 383 阅读 · 0 评论 -
KMP算法
串的简单模式匹配给出主串S和模式串T,要求找出T在S中的第一个位置。很容易想到的枚举法,就是从第一个字符开始,逐个比较S和T的字符,若相等就继续比较后续字符,否则从S当前与T匹配的第一个字符的下一个字符起再重新和T的第一个字符比较。即初始化 i = j = 0,若S[i] == T[j],则 i++; j++; 否则 i = i - j + 1; j = 0;代码如下:int Matc原创 2016-05-28 13:03:18 · 340 阅读 · 0 评论 -
HDU 2825 Wireless Password (AC自动机+DP+状态压缩)
题目大意有m个单词,每个单词的长度不超过10。求长度为n的串包含至少k个单词的串的数量,所有字符均有小写字母组成。(0<=m<=10,1<=n<=25)分析将所有单词构造成AC自动机用状态压缩表示单词,val[i]表示结点i包含的单词;状态dp[i][j][k]表示长度为i的串,到达状态j,包含k的word时的数量状态转移方程dp[i+1][v][k|val[v]] += dp[i][j原创 2015-10-15 21:19:47 · 486 阅读 · 0 评论 -
HDU 3336 Count the string (KMP + DP)
题目大意一个长度为n的字符串,求它的所有前缀在串中出现的次数和,并取模10007分析该题等价于 求每一个前缀,所包含的前缀和,比如对于串abab,前缀a包含a,前缀ab包含ab,前缀aba包含a , aba ,前缀abab包含前缀ab , abab,所以总和为6。对字符串预处理,求出它的失败函数f。dp[i]表示前缀i-1的前缀数量,则dp[i] = dp[f[i]]。 答案即为所有dp[原创 2015-09-21 18:57:37 · 312 阅读 · 0 评论 -
HDU 5441 Travel (并查集)
题目大意n个点m条边的无向图,给出每条边的权值,给出q次询问,每次给出一个值,求用到所有边权不大于这个值的边的情况下,能够互相到达的点对的个数。分析给m条边的权值和查询的值都从小到大排序然后对于每个查询,把不大于这个值的边加入到并查集中去,并记录第一个比查询值大的边的标号,下次查询从此标号开始即可。因此,每条边只需遍历一次。sum[i]表示以节点i为根的子树拥有根节点的个数,因此对于每个查询的原创 2015-09-16 19:45:24 · 316 阅读 · 0 评论 -
POJ 2992 Divisors (快速求阶乘的素因子)
题目意思很明确, 就是求C(k , n) (0 ≤ k ≤ n ≤ 431)的因子个数,保证答案不会超long long。很容易想到用唯一分解定理来求解 , 想办法将C(k , n)变为 p1^e1 * p2^e2 * ... * pn^en那么很容易得出它的因子个数为 (1 + e1) * (1 + e2) * ... * (1 + en)由于 C(k , n) = n! /原创 2015-09-10 13:28:35 · 643 阅读 · 0 评论 -
POJ 1845 Sumdiv (唯一分解定理+求等比数列前n项和)
题目大意:先求出A^B(0 <= A,B <= 50000000)的因数之和sum, 然后求sum % 9901的值。由于A,B的取值范围很大, 所以直接运算肯定不行。唯一分解定理任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积所以 A = p1^q1 * p2^q2 * …… * pn^qn(pi为素数) 从而 A^B = (p1^q1 * p2^q2 * …原创 2015-09-09 23:41:35 · 874 阅读 · 0 评论 -
HDU 1452 Happy 2004 (唯一分解定理 + 求等比数列前n项和)
题目大意:先求2004^X 的因子和sum , 然后求sum%29.同POJ 1845 类似。 先将2004分解成素数的乘积。然后对于2004^X , 改写成 p1^(q1*X) * p2^(q2*X) * ... * pn^(qn*X)从而知道2004^X的因子的和为 (1+p1+p1^2+...+p1^(q1*X)) * (1+p2+p2^2+...+p2^(q2*X)) * .原创 2015-09-10 00:09:18 · 361 阅读 · 0 评论