ACM解题报告
文章平均质量分 70
Onlyan
这个作者很懒,什么都没留下…
展开
-
HDU2136 巧用素数打表法
每个素数在素数表中都有一个序号,设1的序号为0,则2的序号为1,3的序号为2,5的序号为3,以此类推。现在要求输出所给定的数n的最大质因子的序号,0本题解法十分巧妙,利用筛选素数的方法进行打表,将某个素数和它的倍数所求的解都设置为该素数的序号,从小到大循环,这样数组中存放的就是输入的n对应的解了。#includeusing namespace std;const i原创 2011-09-04 19:11:06 · 3405 阅读 · 1 评论 -
POJ3249 工作难题(DAG有向无环图的单源最短路径)
有N个城市,它们之间存在一些单向路径,若可以从城市i到城市j,则一定无法从城市j到达城市i,只出不入的城市称为源点城市,只入不出的城市称为终点城市。已知到达某个城市就可以获得或者失去一定的钱财。现在狗先生从某个源点出发,到达某个终点停止,他想拥有尽量多的钱财。要求给出最多的钱财是多少。题目给定的是一个有向无环图。最多的钱财可以转换成最短路径问题,每条边的权重其实就是到达该边的终点得到或失去的钱原创 2012-12-07 20:53:01 · 1781 阅读 · 0 评论 -
POJ2387 最短回家路径(单源最短路径)
给定N个点以及它们之间的一些双向路径,求出从第N个点到第1个点的最短路径。纯粹的单源最短路径题目,图的点最多有1000个,而边最多有2000条(题目数据量不对,数据中可能包含多于2000条边的数据),即边数并没有点数的平方那么多,因此应该考虑使用邻接表存储图,然后采用SPFA或者堆优化的DIJKSTRA求解。#include #include #include using names原创 2012-12-07 19:01:52 · 866 阅读 · 0 评论 -
POJ3159 最大差距(差分约束系统)
班上有n个同学,现在有一些糖要分给他们,设第i个同学得到的糖为p[i],分糖必须满足条件:第i个同学要求第j个同学的糖不能超过自己k个,即p[j] - p[i] = 0。要求在满足这些条件的情况下,求出p[n] - p[1]的最大值。由p[j] - p[i] 在单源最短路径的算法中有一步是“若mindis[j] > mindis[i] + dis[i][j],则mindis[j] = mi原创 2012-12-07 12:20:17 · 3882 阅读 · 0 评论 -
POJ3259 回到过去(带负权的单源最短路径)
有N个农场,它们之间有M条普通的双向路径,同时有W条单向“虫洞”,通过普通路径需要花费时间,但通过虫洞却可以回到过去。问能否从任意一个点出发,通过某些普通路径或者“虫洞”再回到起始位置,使到达的时间早于出发的时间。这是带负权的单源最短路径的入门题,按题目给定的边建好图,从任意一点起点开始,使用Bellman-Ford算法运行一遍,判断有没有回路就可以了。#include #include原创 2012-12-06 22:15:30 · 832 阅读 · 0 评论 -
POJ1006 中国剩余定理
“今有物不知其数,三三数之余二,五五数之余三,七七数之余二,求物几何”问的是现在有一堆物品,物品数除以三余二,除以五余三,除以七余二,求物品有多少个。 这个问题的解法很简单,lcm(3,5)=15 lcm(3,7)=21 lcm(5,7)=35 lcm(3,5,7)=10515%7=1 21%5=1 35*2%3=1因此15*2+21*3+70*2=233,233%1原创 2011-10-24 12:00:00 · 695 阅读 · 0 评论 -
POJ3974 求字符串的最长回文子串的长度
回文串:如果某个字符串从左往右看与从右往左看是一样的,则称该字符串为回文串。最长回文子串:求解一个字符串,它是某个给定字符串的子串,并且是回文串。本题要求对于给定的字符串,求出它的最长回文子串的长度。可以采用Manacher算法在O(n)时间内求解。#include #include #include #include using namespace std;const原创 2012-11-21 15:31:24 · 6261 阅读 · 0 评论 -
POJ3294 出现在至少k个字符串中的最长子串
给定n个字符串,求出现在多于n/2个字符串中的最大长度的子串。用朴素的搜索方法肯定不能满足时间要求。因此还是使用后缀数组。首先把问题变成判定性问题,即长度为某个值的满足条件的子串是否存在。这样就可以使用二分来求解。接着是把n个字符串用某个字符连接起来。计算出sa数组和height数组。对于每个需要判定的长度,对height数组进行分组,对每个分组分别进行统计,如果该分组中包含了多于n/原创 2012-11-24 01:03:03 · 3490 阅读 · 1 评论 -
POJ1094 字母排序(拓扑排序)
对于N个大写字母,给定它们的一些偏序关系,要求判断出经过多少个偏序关系之后可以确定它们的排序或者存在冲突,或者所有的偏序关系用上之后依旧无法确定唯一的排序。利用拓扑排序即可解决这个问题,但由于题目要求的是经过多少个关系之后就可以确定答案,因此每读入一个关系,就要进行一次拓扑排序,如果某一次拓扑排序之后可以确定它们的唯一排序或者发现冲突存在,则后面的直接略过。若读入所有关系之后依然无法确定唯一关原创 2012-12-05 16:28:14 · 4979 阅读 · 0 评论 -
POJ3687 球的标签(拓扑排序+优先队列)
给定N个球,这些球的编号分别是1-N中的某个数字,它们的重量也分别是1-N中的某个数字,任意两个球的编号和重量不相等。给定一些类似a这道题是一个拓扑排序问题,把每个编号的球看成一个点,把约束看成点之间的边,构造出一个有向图进行拓扑排序。但由于题目要求输出的答案必须是编号小的球重量尽量轻,因此如果直接拓扑排序,则得到的答案不满足条件。解决的方法是改变每条边的方向,并且使用优先队列来存放入度为原创 2012-12-04 23:45:15 · 1771 阅读 · 0 评论 -
POJ2367 拓扑排序入门
拓扑排序入门题,此题基本正常的方法都能过,不需要判断是否存在环的情况。#include #include #include using namespace std;const int N = 105;struct Edge{ int pos; int next;};int n;int indeg[N];Edge edge[N * N];int cur;int ne原创 2012-12-04 21:13:04 · 1674 阅读 · 0 评论 -
POJ1135 多米诺效应(单源最短路径+枚举)
有N个关键的多米诺骨牌,这些牌通过一些路径相连接,这些路径是由一排其他骨牌构成的。已知每一条路径上的骨牌倒下需要的时间。现在从把编号为1的关键骨牌推倒,问多长时间后所有的骨牌(包括关键牌和它们之间的路径上的骨牌)都倒下,时间精确到小数点后一位。骨牌可以往两个方向倒,因此路径都是双向的。可以把N个关键牌抽象为N个点,路径抽象为点之间的边。然后通过求单源最短路径的算法求出从第一个关键牌到其他关键牌原创 2012-12-08 12:23:07 · 1966 阅读 · 0 评论 -
POJ1502 信息传递(单源最短路径)
N个处理器要进行信息传递,处理器i传递信息给自己不需要时间,处理器i与处理器j之间相互传递信息的时间是一样的,不同处理器之间传递信息所需要的时间由一个矩阵的下三角给出。若矩阵对应位置为x,则说明相应的两个处理器之间无法传递信息。求从第一个处理器传递信息到其他所有处理器最少需要多少时间。特殊处理一下值为x的情况,建立邻接阵,运用单源最短路径算法求出第一个处理器到其他所有处理器的最短传递信息时间,原创 2012-12-08 12:48:00 · 4429 阅读 · 0 评论 -
POJ1062 昂贵的聘礼(单源最短路径+枚举)
有N件物品,每件物品有三种属性(主人的等级、价格、替代品数目),替代品加上较少的金币可以用来交换该物品,但交换过程中最高等级与最低等级不能超过某个数。问为了得到第一件物品,最少需要支付多少钱。可以转换为单源最短路径求解,每条路径由某件物品指向它的替代品,路径长度是优惠的金币数。因为交换过程中等级差不能超过某个数m,因此可以采用枚举等级区间来解决这个问题,每个区间为[a, a+m],a的取值范围原创 2012-12-08 23:31:30 · 701 阅读 · 0 评论 -
POJ2240 套汇(单源最短路径)
给定N种货币以及它们之间的一些兑换率,问是否存在套汇的可能,使某种货币的金钱经过套汇之后变得更多。简单的单源最短路径问题,把每种货币看成一个点,点的初始值只需随便指定一个大于0的数,然后使用bellman-ford算法判定某个点的金钱是否可以无限增多,即是否存在正环。#include #include #include #include using namespace std;原创 2012-12-12 21:38:48 · 1906 阅读 · 0 评论 -
POJ3615 跨栏最大高度(多源最短路径)
有N个地点,它们之间存在M条单向路径,每条路径中间有一个栏。现在给定一些起点和终点,要求找出它们之间的一条路径,使路径经过的栏的高度的最大值最小。简单的多源最短路径,把路径值变成经过的最大高度值,用FLOYD算法更新每对点之间的最大高度值,然后对于每个起点和终点输出它们之间的最大高度值,若无法从起点到达终点,则输出-1。#include #include #include using原创 2012-12-11 22:41:23 · 895 阅读 · 0 评论 -
POJ1860 货币兑换(单源最短路径)
给定N种货币,某些货币之间可以相互兑换,现在给定一些兑换规则,问能否从某一种货币开始兑换,经过一些中间货币之后,最后兑换回这种货币,并且得到的钱比之前的多。可以把初始兑换的货币看成源点,采用bellman-ford进行求解,若可以实现要求,则说明图中存在可以无限增大的环,这个可以通过bellman-ford算法判断环是否存在求出来,若在求解过程中发现已经兑换回原货币,并且钱比之前多,则可以直接原创 2012-12-12 10:55:03 · 7494 阅读 · 0 评论 -
POJ3037 滑雪(单源最短路径)
给定一个M*N的网格,已知在每个网格中的点可以向上下左右四个方向移动一个单位,每个点都有一个高度值,从每个点开始移动时存在一个速度值,从A点移动到B点,则此时B点的速度为"A的速度*2^(A的高度值-B的高度值)",而A点移动到B点所用的时间则是A点开始移动的速度值的倒数。提供网格的长和宽,每个点的高度,以及在左上角的点的出发速度,问从左上角的点到右下角的点最少需要多少时间。由于2^(h1-h原创 2012-12-10 23:55:12 · 1793 阅读 · 1 评论 -
POJ3268 牛的最长来回时间(单源最短路径)
有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。每头牛返回的最短时间很简单就可以算出来,这相当于从目标牛为起点求单源最短路径。但每头牛出发到目标牛的最短时间无法直接算出来,稍微转换一下,发现这个最短时间其实可以通过把所有的边取反向,然后再从目标牛求一次单源最短路径得到。得到这两个最短路径原创 2012-12-05 21:42:33 · 4581 阅读 · 0 评论 -
POJ1125 股票经济人通信网络(多源最短路径)
有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint。简单的多源最短路径问题,用floyd算法求出所有存在的路径,然后对每个人判断是否可以由他来传递以及传递的时间,取最小的那个即可。#include #include #in原创 2012-12-10 10:17:10 · 3079 阅读 · 0 评论 -
POJ1797 道路可承受的最大重量(单源最短路径变形)
有编号为1-N的地点,它们之间存在一些双向路径,每条路径有它的最大可承受重量,现在要从编号为1的地方向编号为N的地方运送货物。问运送的货物的最大重量。采用类似最短路径的思想,把到达每个点的最短路径变成到达每个点的货物的最大重量,采用dijkstra或spfa运行一遍,把最后一个点的最大重量输出即可。#include #include #include #include using原创 2012-12-09 22:15:34 · 1180 阅读 · 0 评论 -
POJ1724 价格合适的最短路(广搜BFS)
有编号为1-N的城市,这些城市之间存在一些单向路径,通过某条路径需要支付与路径长度一样的金币。BOB要从城市1到城市N,但他的金币数是有限的,现在要求找出从第1个城市到第N个城市的一条路径,既满足BOB支付得起路费,又满足总路径长度最小。有点类似最短路,但因为有两个约束条件,所以说成广搜更加合适。维护一个优先队列,队列中存放的状态包括到达某个点剩下的金币和走过的路径长度,其中剩下的金币数必须为原创 2012-12-09 21:31:49 · 1887 阅读 · 0 评论 -
POJ1511 最小总费用(单源最短路径)
有编号为1-N的车站和学生,现在要从第一个车站开始把学生运输到相应的车站,然后把所有学生从相应的车站运回第一个车站,要求运输的总费用的最小值。从第一个车站往其他车站运送学生的最小总费用其实就是以第一个车站为源点的所有最短路径的和。从其他车站运送学生回第一个车站的最小总费用可以通过把所有边逆向之后,再以第一个车站为源点的求所有最短路径的和,因为题目保证可以从任意一个车站去到另一个车站,因此边的方原创 2012-12-09 00:45:54 · 992 阅读 · 0 评论 -
POJ2185 最小覆盖矩阵
给定一个由字符组成的矩阵,求出它的面积最小的覆盖矩阵。最小覆盖矩阵类似于最小覆盖子串,只不过是扩展到二维而已。最小覆盖子串必定是原串的前缀,对于矩阵,可以求出每一行的最小覆盖子串的长度,只要对这些长度求最小公倍数,就可以获得最小覆盖矩阵的宽度。同理,求出每一列的最小覆盖子串的长度,再求最小公倍数,就可以获得最小覆盖矩阵的高度了。这里有一个地方要注意,如果求最小公倍数的过程中发现“行原创 2012-11-18 20:09:39 · 3554 阅读 · 2 评论 -
POJ2752 既是前缀又是后缀的子串
给定一个字符串s,从小到大输出s中既是前缀又是后缀的子串的长度。此题非常简单,借用KMP算法的next数组,设s的长度为n,则s串本身必定满足条件。其他满足条件的子串都有个特征,就是该子串的最后一个字符肯定与s的最后一个字符相同。这正是next数组发挥作用的时候。从n - 1位既最后一位开始回滚,若s[next[n-1]] == s[n-1],则子串s[0,1,2,...,next[n-1]]原创 2012-11-18 19:13:26 · 5918 阅读 · 0 评论 -
POJ1961 子串重复出现最大次数
给定一个字符串s,设它p为它的前缀,若多个p(大于等于2个)相连接之后仍为s的某个前缀,则输出相关信息。如:s="abcabcabcab",则对于p="abc",两个p相连接之后为“abcabc”,三个p连接之后为"abcabcabc",这两者都是原串s的前缀,则输出多个p连接之后的前缀长度,以及它是由多少个p连接而成的。若对于某个满足条件的前缀,它既可以由n1个p1连接而成,又可以由n2个p原创 2012-11-18 18:55:06 · 489 阅读 · 0 评论 -
POJ3250 牛的视野(单调栈)
一群高度不完全相同的牛从左到右站成一排,每头牛只能看见它右边的比它矮的牛的发型,若遇到一头高度大于或等于它的牛,则无法继续看到这头牛后面的其他牛。给出这些牛的高度,要求每头牛可以看到的牛的数量的和。把要求作一下转换,其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就原创 2012-11-27 13:38:37 · 6827 阅读 · 3 评论 -
POJ2823 滑动窗口中元素的最值(单调队列)
给定一个大小已知的数组以及一个大小已知的滑动窗口,窗口每个时刻向后移动一位,求出每个时刻窗口中数字的最大值和最小值。这个题是单调队列的入门题。求最大值:建立一个单调递减队列,元素从左到右依次入队,入队之前必须从队列尾部开始删除那些比当前入队元素小或者相等的元素,直到遇到一个比当前入队元素大的元素,或者队列为空为止。若此时队列的大小超过窗口值,则从队头删除元素,直到队列大小小入窗口值为止。然原创 2012-11-27 13:30:39 · 8834 阅读 · 3 评论 -
POJ2559 最大矩形面积
给定从左到右多个矩形,已知这此矩形的宽度都为1,长度不完全相等。这些矩形相连排成一排,求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积。所求矩形可以横跨多个矩形,但不能超出原有矩形所确定的范围。建立一个单调递增栈,所有元素各进栈和出栈一次即可。每个元素出栈的时候更新最大的矩形面积。设栈内的元素为一个二元组(x, y),x表示矩形的高度,y表示矩形的宽度。若原始矩形高度分别为原创 2012-11-27 16:58:19 · 12181 阅读 · 3 评论 -
POJ2299 树状数组求逆序数
给定n个数,要求这些数构成的逆序对的个数。除了用归并排序来求逆序对个数,还可以使用树状数组来求解。树状数组求解的思路:开一个能大小为这些数的最大值的树状数组,并全部置0。从头到尾读入这些数,每读入一个数就更新树状数组,查看它前面比它小的已出现过的有多少个数sum,然后用当前位置减去该sum,就可以得到当前数导致的逆序对数了。把所有的加起来就是总的逆序对数。题目中的数都是独一无二的,这些数最原创 2012-11-03 10:24:32 · 11348 阅读 · 3 评论 -
POJ3368 离散化+ST算法求解RMQ
给定一个数组,其中的元素满足非递减顺序,要求对于一对起点和终点,回答出其中某个元素重复出现的最大次数。比如对于-1 -1 1 1 1 1 3 10 10 10,若起点为1,终点为5,则重复出现最大的数是1,其次数为3。由于原数组是非递减的,因此相同的数字必然是连续出现的。可以对原数组进行压缩,把相同数字构成的区间抽象为一个数,这个数就是这个区间的大小。比如上述数组可以压缩为2 4 1 3。原创 2012-11-03 19:10:08 · 1772 阅读 · 1 评论 -
POJ2299 归并排序求逆序数
本题要求对于给定的无序数组,求出经过最少多少次相邻元素的交换之后,可以使数组从小到大有序。两个数(a, b)的排列,若满足a > b,则称之为一个逆序对。很明显可以知道,如果相邻的两个元素满足前一个大于后一个,则肯定要交换一次,因为最终位置是小的在前,大的在后。因此本题其实就是求原数组中的逆序对的数目。求逆序对的数目可以使用归并排序,其实逆序对的数目是归并排序的一个附属产品,只是在原创 2012-10-27 19:00:42 · 3710 阅读 · 0 评论 -
HDU2553 N皇后问题(回溯法)
此题是经典的N皇后问题,描述:在一个N*N的棋盘上要摆放N个皇后,要求任意两个皇后不能在同一行,同一列或者同一条与棋盘的边成45度角的斜线上,即与对角线平行的斜线上,求对于不同的N,各有多少种摆法使任意两个皇后不能相互攻击。用回溯法就可以解决,设皇后的编号依次为1,2,……,n,则可以认为第i个皇后必须摆放在第i行,然后枚举第一个皇后的位置进行回溯,若某一次发现某个皇后无法找到摆放位置原创 2011-09-07 10:17:23 · 3413 阅读 · 1 评论 -
POJ1001 高精度乘法
http://poj.org/problem?id=1001好久没做关于大整数的题了,有点恐惧感,这题一直没尝试,感觉又要大整数又要小数点的有点麻烦,而且答案还要去掉前导0和后导0。其实看了一下题,输入比较规范,前6位是第一个数A,后面是该数的多少次方N,大整数的乘法可以模拟笔算乘法来做。此题第一步就是处理输入的数A中的小数点,先把小数点去掉,把原来的数存储在一个整型数组中,记录小原创 2011-09-18 22:53:14 · 14958 阅读 · 7 评论 -
HDU1060 数学方法实现超大数计算
(转自网上牛人解题报告)题目大意是输入N,求N^N的最高位数字。1估计大家看到N的范围就没想法了。确实N的数字太大,如果想算出结果,即使不溢出也会超时。题目是这样转化的。首先用科学计数法来表示 N^N = a*10^x; 比如N = 3; 3^3 = 2.7 * 10^1;原创 2011-09-04 20:34:36 · 2236 阅读 · 0 评论 -
BOJ212 树的先序遍历
http://boj.me/onlinejudge/newoj/showProblem/show_problem.php?problem_id=212这是区域赛北京赛区的一个题,题意不难,就是树的遍历过程。输入是一个长字符串,同一对括号中的字符串属于同一等级的结点,第一个是根结点,比如a(b,c(d,e),f)这个输入,表示根结点为a,a有三个子结点b,c,f,其中c有两个子结点d,e,要求根原创 2011-09-19 11:24:13 · 860 阅读 · 0 评论 -
POJ2406 子串重复出现最大次数
此题与POJ1961思想完全一样。给定字符串s,要求找到子串p,使得s由多个p(大于等于1)连接而成,输出此时p的个数。若有多种可能,则输出最大的个数。类似于POJ1961,先构造next数组,然后直接使用n / (n - next[n])即可获得答案。n为字符串s的长度。#include #include #include using namespace std;int N原创 2012-11-18 19:01:55 · 642 阅读 · 0 评论 -
POJ2002 正方形的个数(二维点的哈希)
给定N个点,求出这些点一共可以构成多少个正方形。若正方形为ABCD,A坐标为(x1, y1),B坐标为(x2, y2),则很容易可以推出C和D的坐标。对于特定的A和B坐标,C和D可以在线段AB的左边或者右边,即有两种情况。因此只需要枚举点A和点B,然后计算出两种对应的C和D的坐标,判断是否存在即可。这样计算完之后得到的答案是正确答案的4倍,因为正方形的4条边都枚举了,所以答案要右移两位。原创 2012-12-01 23:11:12 · 5577 阅读 · 1 评论 -
POJ1840 解方程(数的哈希)
给定a1, a2, a3, a4, a5,求符合条件的解(x1, x2, x3, x4, x5)的个数,使得a1*x1^3 + a2*x2^3 + a3*x3^3 + a4*x4^3 + a5*x5^3 = 0。其中-50 x1-x5各有100个可能值,相互的解法是使用5重循环逐一判断,但这样用的时间太长了。因此可以把它们分为两部分(x1, x2)和(x3, x4, x5),求出所有的sum原创 2012-12-01 20:13:02 · 838 阅读 · 0 评论 -
POJ3274 牛的属性和(数的哈希)
给定多头牛的属性,每头牛的属性由一个非负数表示,该数的二进制表示不会超过K位,它的二进制表示的每一位若为1则表示该牛有对应的第i种属性,若为0则表示没有该属性。对于给定的牛的顺序,要求输出某一段子序列的长度,这个子序列中的牛的K个属性对应相加以后全部相等。假设n=3, k = 3输入的3个数变成的二进制分别为(a1, a2, a3), (b1, b2, b3), (c1, c2, c3原创 2012-12-01 16:02:48 · 3400 阅读 · 1 评论