算法竞赛
介绍了ACM程序设计比赛中常用的算法以及技巧。
Eureka_Yi
努力学习ing.
展开
-
[动态规划]UVA357 - Let Me Count The Ways
题意:经过在百货公司的一场血拼之后,小梅发现她身上的零钱共有17分(cent,美金货币单位,其他货币及面值请参考下方红字部分),分别是1个dime,1个nickel,以及2个penny。隔天,小梅去便利商店买完东西后发现她身上的零钱恰好又是17分,这次是2个nickel及7个penny。小梅就在想,有几种硬币的组合可能凑成17分呢?经过仔细算算之后,发现共有6种。你的问题就是:给一个金额,请你回答共有多少种硬币组合的方式。思路:动态规划的水题目,又是换硬币这一类型的题目。原创 2014-04-16 22:54:49 · 1825 阅读 · 0 评论 -
[动态规划]UVA147 - Dollars
题意:纽西兰的货币包含了$100, $50, $20, $10, $5 的纸钞和$2, $1, 50c, 20c, 10c, 5c 的硬币。给你某金额的数字,请你写一个程式回答:使用这些面额的纸钞或硬币,有多少种不同的方法可以组合成这个金额。例如:20c 可以有4个方法可以得到:(改变金额的顺序不会增加方法数,例如2 * 5c + 1 * 10c 和下面第3种方法视为同一种)1 * 20c2 * 10c1* 10c + 2 * 5c4 * 5c思路:硬币转转,典型的DP题目。输入有点坑爹,用原创 2014-04-16 20:34:17 · 1525 阅读 · 0 评论 -
[动态规划]UVA10192 - Vacation
题意:题意说了大堆,其实题意就是求两个字符串的最大匹配子串。思路:非常典型的LCS题目,直接最简单的动态规划就可以解决原创 2014-04-16 11:52:41 · 1347 阅读 · 0 评论 -
[动态规划]UVA10066 - The Twin Towers
题意:从前从前在古帝国有2座高塔位于2座城市中,他们的形状不太相同。但是他们都是用圆柱形的石块一个堆在另一个上面建起来的。每个圆柱形石块的高度都相同(定为1),但是半径却不一。所以,虽然2座高塔的形状不一样,但事实上他们可能有许多石块是相同的。在高塔建成的一千年后,国王要求建筑师拿掉高塔的某些石块,使得2座高塔的形状大小和高度一样。但同时要尽可能让高塔的高度越高越好。新高塔的石块的顺序也必须和原来的高塔一样。国王认为这样可以代表2座城市之间的和谐与平等。他为这2座高塔命名为「双子星塔」现在,你的任原创 2014-04-16 10:31:05 · 1528 阅读 · 0 评论 -
[动态规划]UVA10003 - Cutting Sticks
题意:你的任务是替一家叫Analog Cutting Machinery (ACM)的公司切割木棍。切割木棍的成本是根据木棍的长度而定。而且切割木棍的时候每次只切一段。很显然的,不同切割的顺序会有不同的成本。例如:有一根长10公尺的木棍必须在第2、4、7公尺的地方切割。这个时候就有几种选择了。你可以选择先切2公尺的地方,然后切4公尺的地方,最后切7公尺的地方。这样的选择其成本为:10+8+6=24。因为第一次切时木棍长10公尺,第二次切时木棍长8公尺,第三次切时木棍长6公尺。但是如果你选择先切4公尺的地原创 2014-04-15 21:49:32 · 1570 阅读 · 0 评论 -
[动态规划]UVA103 - Stacking Boxes
题意:在数学或电脑科学里,有些概念在一维或二维时还蛮简单的,但到N维就会显得非常复杂。试想一个 n维的「盒子」:在二维空间里,盒子( 2 , 3 )可代表一个长为2个单位,宽为3个单位的盒子;在三维空间里,盒子( 4 , 8 , 9 )则是一个4*8*9(长、宽、高)的盒子。至于在六维空间里,也许我们不清楚( 4 , 5 , 6 , 7 , 8 , 9 )长得怎样,不过我们还是可以分析这些盒子的特性。在此问题里,我们要算出一组n维盒子里,它们的「最长套入串列」: b 1 , b 2 , ......,b原创 2014-04-15 14:43:48 · 1507 阅读 · 0 评论 -
[动态规划]UVA10405 - Longest Common Subsequence
题意:求两个字符串的最长匹配子串。思路:动态规划的典型题目。比较基础。原创 2014-04-15 14:37:09 · 1643 阅读 · 0 评论 -
[动态规划]UVA10827 - Maximum sum on a torus
题意:环形矩阵上的最大子矩阵和。思路:先复制三个矩阵拼接成一个大的矩阵,然后枚举所求最大子矩阵在第一个矩阵中的左上角,再通过动态规划的方法求出长宽不大于N的最大子矩阵,各种枚举情况中的最大和即为所求解。原创 2014-04-13 15:10:56 · 1015 阅读 · 0 评论 -
[动态规划]UVA111 - History Grading
题意:在资讯科学中有一些是关于在某些条件限制下,找出一些计算的最大值。以历史考试来说好了,学生被要求对一些历史事件根据其发生的年代顺序来排列。所有事件顺序都正确的学生无疑的可以得满分。但是那些没有全对的人又该如何给分呢?以下有2种可能的给分方式:每个与标准答案的顺序相同的事件得1分每个在最长(但不一定要连续)的序列事件中,其相对的顺序亦可以在标准答案发现者,每个事件得1分。举例说明:如果有4个事件其发生时间的顺序依次是1 2 3 4(就是标准答案啦,意思是第1个事件发生顺序为1,第2个事件发生的顺原创 2014-04-13 11:14:34 · 1254 阅读 · 0 评论 -
[动态规划]UVA108 - Maximum Sum
题意:给出一个方阵,这个这个方阵里面元素和最大的一个矩阵。思路:最大连续子序列的升级版本,把原来的一维矩阵变成了二维的矩阵,需要转换思路,把二维矩阵看成一维数组,这个一维数组的元素是二维数组中同一列的元素相加。首先思路是枚举这个矩阵大小,再扫描。原创 2014-04-11 20:05:10 · 1366 阅读 · 0 评论 -
[动态规划]UVA 507 - Jill Rides Again
题意:题目虽然很长,但是题意比较清晰,就是给出一段数字,求这段数字的最大连续子串和。但是注意的是在值相等的情况下,优先选择距离最长的。思路:很明显的动态规划的题目,状态转移方程:sum[i] = max{sum[i-1]+a[i],a[i]}原创 2014-04-11 19:59:52 · 1210 阅读 · 0 评论 -
[贪心]UVA11100 - The Trip, 2007
题意:有一个团队要外出旅行,需要带很多包,大包里面能放小包,问这些包最后剩下多少个包。思路:贪心,先排序,由于大包里面能放小包,所以最后剩下的包的个数是相同大小的包的个数的最大数原创 2014-04-10 10:42:27 · 1319 阅读 · 0 评论 -
[贪心]UVA10716 - Evil Straw Warts Live
题意:给出一个字符串,问最少通过多少次交换可以把它变成回文串。如果不能变成回文串输出impossible。题意:完全没想出是贪心,一开始还想暴力搜索的。。智商捉急啊,各种不会做。在移动的时候我们不妨先用点贪心的思想,每次应该先把两端的变成回文,如果我们先让两端变成回文之后,这样中间的字符在移动的时候就有可能少和1个移到两端的字符发生交换,因此这样的决策不会产生负面影响。 接下来就是去想我们要怎样让两端变成回文的了,其中一个猜想就是如果两端字符不同,那么就固定两端之一不动,通过移动另外一个字符使原创 2014-04-06 19:20:00 · 1109 阅读 · 0 评论 -
[贪心]UVA10720 - Graph Construction
题意:给出N个顶点的度数,判断这N个顶点是否构成图。思路:为保证其尽可能为图,要优先考虑大度数之间的点优先连接。在这里可以采取依次减度数的方法推断能否构成图。如:3,3,2,2,1五个点,从度数最大的开始考虑,先去掉3,则后面紧接的三个点度数依次减去1,剩下的四个点排序后为2,1,1,1,再去掉度数最大的2,后面的两个点一次减去1,排序后剩下三点为1,0,0,1后的一点度数再减去1,则为-1,明显不成立,为Not possible。ps:简直坑,提交了好多次,总是WA,找了好久的bug,发现最后的Not原创 2014-04-06 11:43:57 · 1254 阅读 · 0 评论 -
[贪心&&排序]UVA10670 Work Reduction
题意:现在有N个任务要做,而且要留M个到明天做,你自己做不完,只能请团队帮你做,每个团队有两种方案,一个一个任务做或者把你当前的任务的一半做掉,花费各不相同,求出对每一个团队的最小花费。思路:典型的贪心题目,每次都选择最优方案,并且保证当前的任务数量大于等于M。原创 2014-04-06 11:34:22 · 1134 阅读 · 0 评论 -
[贪心]UVA10382 Watering Grass
题意:有一个草坪,在草坪中有一些喷水装置,给出这个草坪的长和宽,和喷水装置的位置和半径,求最少放置多少个喷水装置能使得草坪被全部覆盖?思路:题目一看,就知道是区间覆盖问题,用贪心解决,因为是圆形区域覆盖不好计算,我们把圆形区域转换到草坪上来,就变成了矩形区域,这样就比较好计算了。原创 2014-04-04 22:11:59 · 1159 阅读 · 0 评论 -
[分治]UVA10245 The Closest Pair Problem
题意:给出N个点,找出这N个点中距离最近的点对。思路:直接暴力的话,肯定超时,一开始想到使用分治,但是不确定,后来看了下网上人的解法,确实是使用分治,首先我们把坐标按x升序进行排列,然后定义L、R分别为区间的左右端点(L、R均代表点的标号),mid为区间中点,我们可以先分别暴力求出在[L,mid]、[mid,R]中最短的线段,不妨设其为min,当然最短线段还可能是两个点分别在两个区间之中,但如果存在这样的最短线段,那么线段的两个端点一定会在区间[a,b]中,并且x[mid]-x[a]>=min,x[b]-原创 2014-04-04 11:09:03 · 1191 阅读 · 0 评论 -
[贪心]UVA10714 Ants
题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间。思路:典型的贪心题目,所有的蚂蚁往一个方向走的时候才会有最大值最小值。原创 2014-04-03 20:53:44 · 1036 阅读 · 1 评论 -
[递归]UVA11129 An antiarithmetic permutation
题意:给定一个包含了0到n - 1的序列。。要使得这个序列中每个长度大于2的子序列都不是等差数列。。思路:对于一个等差的序列。如0 1 2 3 4 5 我们可以这样做,把他分离成2部分等差子序列0 2 4和1 3 5然后组合成一个新的序列0 2 4 1 3 5。这样做的话,可以保证前半部分无法和后半部分组合成等差数列。可以证明,一个序列的等差是k,首项为a1,序列为,a1, a1 +k, a1 + 2k, a1 + 3k .... a1 + (n - 1)k.分成的两部分为a1, a1 + 2k , a原创 2014-03-31 16:24:30 · 1049 阅读 · 0 评论 -
[贪心]UVA11054 Wine trading in Gergovia
题意:题意:一题街道上很多酒店,交易葡萄酒,正数为卖出葡萄酒,负数为需要葡萄酒,总需求量和总售出量是相等的,从一家店到另外一家店需要路费(路费=距离×运算量),假设每家店线性排列且相邻两店之间距离都是1,求最小路费。思路:一开始看出是贪心但是方法完全用错,我的想法是按照出售或者买进的葡萄酒的数量排序,然后依次向右找到要买进或者要卖出的居民,直到所有的都为零,时间复杂度应该是O(N*LogN),但是果断超时了。。后来参考别人的思路,算是明白怎么一回事了我们可以假想第i个人总是与第i+1个人来进行交易来满足原创 2014-03-29 11:49:38 · 1459 阅读 · 0 评论 -
[贪心]UVA10718 Bit Mask
Problem ABit MaskTime Limit1 SecondIn bit-wise expression, mask is a common term. You can get a certain bit-pattern using mask. For example, if you want to make fir原创 2014-03-28 09:47:19 · 1076 阅读 · 0 评论 -
[DFS&&剪枝]uva10400 Game Show Math
题意:在英国有一个数学游戏,给参赛者一些正整数和一个目标数,参赛者必须在这些正整数间插入+、-、*或/ 的符号,使得最后计算的结果等于目标数。计算的方式是由左到右,而且不必管运算的优先顺序(就是不管先乘除后加减那一套)。在这个数学运算式中,有三个限制:正整数出现的次序不可改变,也就是要与输入的顺序相同因为目标数也是一个正整数,所以在运算的过程中,你只有在可以整除的情况下才可以使用/ 。在运算的过程中,如果你用某一个运算符号,会导致产生的数超出(-32000 ~ +32000)的范围,那么你不可原创 2014-03-26 11:53:52 · 1094 阅读 · 0 评论 -
[贪心]UVA10602 Editor Nottoobad
题意:一种编辑器只能通过声音做到两种操作-“repeat the last word”, “delete the last symbol”,其他的都必须自己手动输入,问输入一些单词,最少需要手写输入多少次。思路:这是比较典型得贪心法了,要使得手写输入最少,首先要寻找出最大的匹配前缀,因此把所有的单词按照字典序排序,得到得序列是最优,因为前缀有匹配得都会排到相邻位置。原创 2014-03-26 09:07:37 · 1145 阅读 · 0 评论 -
[暴力]uva10132 File Fragmentation
题意:原本有很多个一样的长串,每个长串都分成了两个短串但是分割的位置不一定相同即两个短串不一定是平分的(就是输入中的那些串)。你要把这偶数个短串拼回那个长串(即2N个短串拼回N个相同的长串),如果有多种可能,任意一种即可,然后输出这个长串思路:输入有点恶心,首先是case数,然后一个空行,然后再输入信息,然后又以一个空行结束该组数据,如果是最后一组数据了,不以空行结束,而是直接以EOF结束。输出,case之间有一个空行,最后一个case后面不要加空行每组case的信息,就是N行的串,串中只有01,串的原创 2014-03-24 16:11:35 · 1079 阅读 · 0 评论 -
[贪心&&二分]uva714 Copying Books
最大值最小化的典型题目题意:给出m个数字,一个数字k,把这m个数字划分为k个区间使得这k个区间中的所有的数相加的最大值最小,k个区间中的数字必须按照原来的顺序。思路:典型的最大值最小化,这是刘汝佳的算法竞赛经典入门中的讲解,然后使用贪心从后往前找。原创 2014-03-17 21:24:06 · 981 阅读 · 0 评论 -
[模拟]uva993 Product of digits
题意:给你一个大于等于0 的整数N,请你你找到最小的自然数Q ,使得在Q 中所有数字(digit)的乘积等于N 。思路:比较简单了,就是判断这个数能否被分解成一串1-9的数字相乘得到。原创 2014-03-16 10:09:00 · 1099 阅读 · 0 评论 -
[模拟水题&&中位数]uva10041 Vito's Family
典型的中位数题目题意:世界闻名的黑社会老大Vito Deadstone要搬到纽约来了。在那里他有一个大家族,并且他们都住在Lamafia大道上。因为Vito时常要拜访所有的亲戚,他想要找一间离他们最近的房子,也就是说他希望从他的家到所有的亲戚的家的距离的和为最小。他恐吓你写一个程式来帮助帮助他解决这个问题。思路:看清楚题目之后就很好理解了,就是典型的中位数。原创 2014-03-15 22:35:27 · 1340 阅读 · 0 评论 -
[贪心]uva311 Packets
一道典型的贪心题目。。题意:有一间工厂生产的东西, 被包装在相同高度h 的正方形容器内, 但其面积大小分别有:1*1, 2*2, 3*3, 4*4, 5*5, 6*6等六种尺寸。这些产品总是用高度为h,面积为6*6的箱子打包后寄给客户。因为成本关系,当然希望将客户所订购的产品放在最少的箱子里寄出。请你写一个程式找出寄送这些产品最少需要多少个箱子,这可以使工厂节省下不少钱。思路:很典型的贪心思路了,首先6*6的盒子只能单独放箱子里,5*5的盒子可以和11个1*1的盒子搭配。4*4的盒子优先和2*2的盒子搭原创 2014-03-15 09:24:04 · 1805 阅读 · 0 评论 -
[贪心&&优先队列]uva10954 Add All
题意:在数组中拿出两个数相加,再把结果放回数组中再如此反复,求最小的结果是多少,典型的哈弗曼编码的题目。思路:使用贪心策略,每次都在数组中取出最小的两个数相加,由此得到的结果最小。使用优先队列较为简单,我自己使用的是set。原创 2014-03-13 09:43:27 · 1142 阅读 · 0 评论 -
[贪心]uva10020 Minimal coverage
题意:给出一个数字M,再给出一些区间,求出使用最少的区间使这些区间覆盖0-M。思路:典型的贪心题目,首先预处理,把和所给的范围不相关的区间过滤掉。再在这些区间中选择使右边的区间能到达最远的范围。原创 2014-03-12 20:58:49 · 907 阅读 · 0 评论 -
[贪心&&栈模拟]uva10700 Camel trading
题意:给你一个没有括号的表达式,只有数字和加乘号,怎么样组合使它最大最小?思路:首先计算+号再计算乘号得到的结果最大,反之结果最小,可以用贪心方法处理,使用栈模拟,处理的时候遇到优先级大的先计算再压入栈中,最后处理优先级小的。原创 2014-03-12 10:05:50 · 914 阅读 · 0 评论 -
[模拟]uva10706 - Number Sequence
思路:这道题暴力肯定超时,我想了很久,没想到什么方法,后来参照了他人的思路和代码。下面是题解观察数字可以找到规律:数字范围 数字位数范围 每个数字宽度 总共数字所占位数1~9 : 1~9. 1 4510~99: 11~189 2 9000100~999: 19原创 2014-03-11 21:22:10 · 969 阅读 · 0 评论 -
[二分搜索]Closest Sums uva10487
题意:给出一个数组和一个数p,求数组中两个不同的数相加使得这两个数之和与这个数p最相近。思路:先排序,在枚举一个数,之后二分查找第二个数,典型的二分,但是我用的是递归的二分查找。。原创 2014-03-07 15:44:08 · 995 阅读 · 0 评论 -
[中位数]A mid-summer night's dream.uva10057
关于中位数的题目题意:我们的科学领导人遇到一个很大的问题,他忘掉了他的密码锁的号码,基于安全性考量,目前的电脑无法解决密码锁的问题。在一个仲夏夜里,科学家做了一个梦,梦里他看到许多数字飞来飞去。他把这些数字纪录在电脑上。接着他想到有一个线索,假如数字列为(X 1 , X 2 , … , X n)他必须找到一个整数A(A就是他密码锁的密码)使得( |X 1-A| + |X 2 -A| + … … + |X n -A|)为最小。思路:很容易就能看出来这个数就是这个数组的中位数。只需区分偶数和奇数的情况就可以原创 2014-02-21 11:14:51 · 1428 阅读 · 0 评论 -
[排序&&模拟]Lining Up uva270
题意:「我要如何解决这个问题呢?」飞行员说。这个飞行员正面临一项不容易的任务,他必须在一个危险区域中的某些定点投掷包裹。因为他只能穿越此区域一次,而且是飞直线,所以他必须尽可能的通过那些定点,以便投掷多一点包裹。所有的定点均以平面座标来表示。从这些定点的座标资料,飞行员想要知道最多有多少个点是在同一直线上的。解法:自己一开始写了个暴力枚举的,结果超时了,后来参考了下某位同学的代码,他的思路是先求出两条直线的斜率,然后排序,斜率相等的并经过同一点的就在一条直线上。这道题水题磨了很久,后来还因为浮点数的原创 2014-02-21 09:44:30 · 1139 阅读 · 0 评论 -
[贪心]Shoemaker's Problem uva10026
一道贪心题目。题意:鞋匠有N件工作要完成。他每天只能做一件工作。并且他知道这些工作分别要几个工作天才能完成。另外,他也知道每个工作被延误一天所需被罚的罚金。延误的天数为从今天算起到该工作开始的那天(所以只有第一件工作没有罚金)。以第一组测试资料为例说明:若工作的顺序是1 2 3 4,那罚金为:0*4+1000*3+4*2+6*5=3038。若工作的顺序是2 1 3 4,则罚金为:0*1000+1*4+4*2+6*5=42。所以第二种工作顺序的罚金较少(事实上也是最少)。你的任务是写一个程式帮助鞋匠找原创 2014-02-20 20:33:52 · 1174 阅读 · 0 评论 -
[模拟]All in All uva10340
一道字符串处理的题目。题意:给你2个字串s,t,请你写一个程式判断是否s是t的子字串。很水的一道题么了,直接模拟就行了。原创 2014-02-20 19:42:00 · 1059 阅读 · 0 评论 -
[二分&&高精度]Solve It uva10341
题意:求一个数x(0<=x<=1)使得函数 p*e-x + q*sin(x) + r*cos(x) + s*tan(x) + t*x2 + u = 0由于函数时单调的,所以可以使用二分查找。原创 2014-02-20 17:00:41 · 981 阅读 · 0 评论 -
[排序]Foreign Exchange uva10763
一到简单的排序题。题意:有一个非营利性的国际性机构执行一项国际交换学生计画。这几年来执行得相当好,有越来越多的学生想要参与这项计画,所以现在请你来帮忙这个机构。每个提出交换学生申请的人有2项资料:他来自哪一国,他想要交换到哪一国。这个计画只有在每个学生都可以找到一个交换对象的时候才算成功。换句话说,假如有一个学生想要从A国到B国,那么一定要有另一个学生从B国到A国。如果只有50个学生提出申请,要判断这计画是否可行相当简单,然而现在最多已经有 500000个学生了。思路:这道题目的思路是求每个学生是否存原创 2014-02-19 15:45:51 · 1148 阅读 · 0 评论 -
[排序]Children's Game uva10905
一道字符串排序题。题意:现在,有许多给小孩子玩的数字游戏,这些游戏玩起来简单,但要创造一个就不是那么容易的了。在这,我们将介绍一种有趣的游戏。你将会得到N个正整数,你可以将一个整数接在另一个整数之后以制造一个更大的整数。例如,这有4个数字123, 124, 56, 90,他们可以制造下列整数─ 1231245690, 1241235690, 5612312490, 9012312456, 9056124123....等,总共可以组合出24(4!)种数字。但是,9056124123是最大的那一个。你可能会原创 2014-02-19 12:09:31 · 1860 阅读 · 0 评论