
挑战程序竞赛 2nd
文章平均质量分 65
Bernini_buffalo
这个作者很懒,什么都没留下…
展开
-
204_矩阵乘幂多项式 Matrix power series (POJ 3233)
给定一个nXn的矩阵A 和正整数k,m。如果 S=A+A^2+A^3+.........A^k,求个元素对吗取余数后的结果。同样,根据矩阵递推出关于k的式子,用乘幂的方法解决。题源来自《挑战程序竞赛》第二版 204页。//// 204_Matrix power series (POJ 3233).cpp// changlle//// Cre原创 2016-01-29 09:31:47 · 470 阅读 · 0 评论 -
162_超大背包问题 (双向搜索)
当背包问题的w和v都巨大时,时间复杂度和空间复杂度都不能满足要求,只能利用双向搜索的方法来求解: 首先将数组分成量部分,对第一部分用位操作的方法来枚举所有的子集的w和v(和),然后排序,去重(去除那些明显不可能的解) 然后对第二部分进行同样的枚举操作,从而找到重量不超过的情况下,价值的最大值。 需要注意的是lower_bound函数的问题,在比较pair类型的元素时,first和原创 2016-01-11 07:55:08 · 681 阅读 · 0 评论 -
160_折半枚举(双向搜索) 4 Values whose sum is 0 (POJ No.2785)
给出4 个数列,A,B,C,D,从每个数列中各取一个,问一共有多少种取法使得4个数的和为0. 如果数字有重复的话算不同的取法。 如果四重循环的话复杂度为n^4,太慢了,所以讲数组分成两组,A和B,C和D,先将CD所有可能的和列出,在对AB做二重循环, 用二分搜索法来找对应的CD的和,最后复杂度为O(n^2 logn). //// 160_4 values whose sum is原创 2016-01-10 15:59:54 · 521 阅读 · 0 评论 -
158_弹性碰撞 Physics Experiment (POJ No 3684)
有N个半径为R厘米的球,进行如下物理实验: 在高处为H米的地方有一个圆筒,把球都垂直放在里面,第i个球底端距离地面的高度为H+2*R*i,实验开始最下面的求先掉落,其他求保持位置不变, 然后每秒放一个球,不计空气阻力,都是弹性碰撞,要求T秒后所有球的位置。 这样来考虑:在第二个,第三个球下面连接n-1个“虚拟球”,速度与原球一致,而碰撞只有在最底部的虚拟球与虚拟球底边接触时才发生,效果原创 2016-01-10 14:25:19 · 545 阅读 · 1 评论 -
153_Filptile (POJ No.3279)
存在一个mxn的方格,有黑色的有白色的。一头奶牛用脚掌踩格子,每次踩一个格子,格子的颜色就反转。 但是奶牛的脚掌比较大,,不光踩到的那个格子要颜色反转,上下左右四个格子都要颜色反转,求最少踩几次格子, 所有的格子都会翻成白色。 此问题和反转奶牛朝向的问题很相似,但是却不能用那样的方法来处理,如果从左到又,从上到下扫面的话,某个格点会被其左边以及下边的格点 所影响,所原创 2016-01-10 10:38:01 · 374 阅读 · 0 评论 -
150_反转(开关问题) Face the right way (POJ No.3276)
N头奶牛排成了一列。每头奶牛向前或者向后。为了让所有的奶牛都面向前方,农夫买了一台自动转向机,机器在购买的时候必须设定一个数值K,机器没操作一次恰好使连续的K头奶牛转向,求使得所有奶牛都转向前的最小的操作次数M和对应的K。首先考虑以下问题:1.各个区间的操作顺序对结果无关,所以可以从左到右来考虑;2.每个区间最多进行一次操作,超过一次的操作完全没有意义;3.对于每个区间的最左端原创 2016-01-10 06:31:02 · 1048 阅读 · 2 评论 -
149_Jessica's Reading problem 尺取法 (POJ No 3320)
一本书中,每一页有一个知识点,希望连续的看一些页数,能包含所有的知识点。请问最短的连续页数是几页? 同样可以用尺取法来求解。首先用set来统计不同知识点的个数。 然后定义s,t,t不断右移动,然后压入map, map的索引是知识点编号,值是知识点现在在此子序列中出现的个数。如果压入map之前, 值为0,说明找到一个新的知识点,num++,直到num为知识点总的的个数为止 然后扣去s原创 2016-01-09 14:16:59 · 356 阅读 · 0 评论 -
146_尺取法 subsequence (POJ No 3061)
给定长度为n的数列整数a以及整数S,求出总和不小于S的连续子序列的长度的最小值,如果不存在,则输出0。 提供O(n)的解法: 对于一个连续的子序列,头为s,尾巴后一位为t,当子序列和>=S时,减去s,s右移动一位,同时更新最短长度(此操作在减去s之前完成); 当子序列的和小于S时,加一个p然后p右移。 只要有s,p其中一个越界时,程序就可返回最小长度。 感觉类似的子序列问题很原创 2016-01-09 12:43:26 · 314 阅读 · 0 评论 -
143_最大化平均值
有n个物品的价值和重量分别为v_i和w_i,从中取出k个物品,求使其单位价值最大的解法。 用单位价值来排序并不可行,原因是如果其中一个物品的重量过大,会严重偏向其单位质量。 解法如下,确定一个平均质量ave,对每个物品求v[i]-w[i]*ave,然后从大到小排序,看前k个的和是否>=0,来作为二分法的判断依据。//// 143_max avarage.cpp// ch原创 2016-01-09 05:32:37 · 312 阅读 · 0 评论 -
142_最大化奶牛间距离 Aggressive cows (POJ No.2456)
有N间牛舍,排在一条线上,有M头奶牛,彼此不待见,会相互攻击,请问为使得每头牛离其他牛尽可能远,那么两头牛之间的最小距离是多少。 又是一题二分搜索法,确定一个最小距离mib,尝试排布,返回bool值作为二分搜索的判断依据。 题源来自《挑战程序竞赛》第二版 142页。 //// 142_aggressive cows.cpp// changlle//// Cre原创 2016-01-09 04:47:59 · 328 阅读 · 0 评论 -
140_割绳子问题 Cable master (POJ No.1064)
有N条绳子,他们的长度分别为L_i。如果从他们中切割出K条长度相同的绳子的话,这K条绳子每条最长能有多少? 用二分搜索法就可以解决,重点是他要规定收敛次数,而不是收敛的差值。规定收敛差值太小的话,可能会导致收敛困难。//// 140_cable master.cpp// changlle//// Created by user on 1/8/16.// Copyr原创 2016-01-09 04:10:12 · 1176 阅读 · 0 评论 -
138_二分搜索 (lower_bound)
lower_bound的实现方式,二分搜索。 //// 138_lower bound.cpp// changlle//// Created by user on 1/8/16.// Copyright (c) 2016 user. All rights reserved.//#include using namespace std;int n=5;int a[原创 2016-01-09 03:46:49 · 276 阅读 · 0 评论 -
051_01背包(DP)
01背包~~~~~不多说了~ //// 051_01 knap sack.cpp// changlle//// Created by user on 12/27/15.// Copyright (c) 2015 user. All rights reserved.//#include #include using namespace std;in原创 2015-12-27 14:57:34 · 221 阅读 · 0 评论 -
047_木板切割问题(fence repair) poj 3253
又是一个贪心问题。 这里使用数组遍历来找到第一小与第二小的木板。后续会给出优先队列的实现方式。//// 047_fence repair.cpp// changlle//// Created by user on 12/26/15.// Copyright (c) 2015 user. All rights reserved.//#include #inc原创 2015-12-27 10:53:01 · 876 阅读 · 0 评论 -
045_saruman's aramy (区间覆盖问题)POJ 3069
给定区间的半径,要求在给定的点集中选择某些点,作为中间点来覆盖左右两边的点。 要求所用的点的个数最少。 贪心算法实现。 题源来自《挑战程序竞赛》第二版 45页。//// 045_saruman's aramy.cpp// changlle//// Created by user on 12/26/15.// Copyright (c) 201原创 2015-12-27 10:47:06 · 247 阅读 · 0 评论 -
202——砖块染色问题 Blocks (POJ 3734)
有N块砖块排成一列,从做往右开始染色,用 红,蓝,绿, 黄这四种颜色的油漆开始染色,求最后染色成功后红色和绿色的方块数都为偶数的方案的个数。类似斐波那契数列的问题,考虑当染到n个方块时,有三种情况:红绿都是偶数个的方案为a,红绿有一个奇数的方案为b,红绿都为奇数的方案为c,所以当染第i+1个方格的时候, a_=2a+b, b_=2a+2b+2c, c_=b+2c所以利用类似斐波原创 2016-01-29 08:40:22 · 506 阅读 · 0 评论 -
200_Fibonacci
Fibonacci数列,使用矩阵来实现,计算A^n 使用递归,复杂度为O(logn)。题源来自《挑战程序竞赛》第二版 200页//// 200_Fibonacci.cpp// changlle//// Created by user on 1/28/16.// Copyright (c) 2016 user. All rights reserved.//#i原创 2016-01-28 14:49:33 · 251 阅读 · 0 评论 -
164_超大区域个数问题(坐标离散化,压缩)
区域个数问题,只不过行列都超大,无法在内存内搞数组来做。(下图来自《挑战程序竞赛》第二版 164页)基本的做法就是进行矩阵压缩,使用坐标离散化的方法,对于行列的每个端点,加上做边的那个,再加上右边的那个,压入vector数组,排序,去除重复的元素,然后用find方法找到端点的坐标,减去数组初始地址,便可求得压缩后的实际端点地址。需要注意的又几点:1. 程序中先排序,原创 2016-01-11 15:53:36 · 496 阅读 · 0 评论 -
196_铺砖问题
铺砖问题,详见《挑战程序竞赛》第二版196页//// 196_brick.cpp// changlle//// Created by user on 1/26/16.// Copyright (c) 2016 user. All rights reserved.//#include using namespace std;int n=3;int m=3;con原创 2016-01-28 12:20:12 · 439 阅读 · 0 评论 -
032_池塘问题(lake counting)
经典的DFS问题,参见《挑战程序竞赛》第二版 32页。只需注意每次对一个 'W' 做完DFS后,将其替换成'.',保证不会重复搜索。个人感觉可以用另一个数组记录访问过的原数组的位置,进一步加快速度。不多说了,上代码,用蛋疼的XCODE写的。//// 033_water_counting.cpp// changlle//// Created by user on 12/22原创 2015-12-27 09:54:18 · 388 阅读 · 0 评论 -
057_完全背包问题(DP)
完全背包问题,不同于01背包问题,每个物品有无限个可以取。 一般会想到在双层循环的条件下再增加一层循环k,来获得重量为j的情况下,只用前i个物品的价值的最大值。 然而在计算时,并不需要惊醒k循环,因为在计算dp[i][j]时,dp[i][j-w(i)]已经计算过了,所以必有: dp[i][j]=max(dp[i-1][j], dp[i][j原创 2015-12-27 15:35:43 · 317 阅读 · 0 评论 -
056_最长公共子序列
最长公共子序列问题,上完cse531还写不出来,要去面壁了。//// 056_longest subsequence.cpp// changlle//// Created by user on 12/27/15.// Copyright (c) 2015 user. All rights reserved.//#include #include原创 2015-12-27 15:18:15 · 231 阅读 · 0 评论 -
035_迷宫最短路径
经典的BFS问题, 貌似amazon有道题和这个挺像的~~参见《挑战程序竞赛》第二版34页。 用队列实现比较方便。依旧XCODE 蛋疼中。废话不多说了,直接po c++代码。//// 035_bfs.cpp// changlle//// Created by user on 12/24/15.// Copyright (c) 2015 user. All rights r原创 2015-12-27 10:06:03 · 414 阅读 · 1 评论 -
039_硬币问题(贪心)
入门级的贪心算法实现。不得不说书上的示例代码真心简介。题源同样来自《挑战程序竞赛》39页。//// 039_coin.cpp// changlle//// Created by user on 12/25/15.// Copyright (c) 2015 user. All rights reserved.//#include using namespace st原创 2015-12-27 10:31:09 · 308 阅读 · 0 评论 -
040_区间调度(贪心)
经典的贪心算法的例子。算法导论里面有讲。同样用c++的pair类型与sort实现效率较高。题源来自《挑战程序竞赛》第二版40页。//// 040_interval.cpp// changlle//// Created by user on 12/26/15.// Copyright (c) 2015 user. All rights reserved.//#incl原创 2015-12-27 10:35:53 · 385 阅读 · 0 评论 -
043_字典序最小问题(best cow line)
poj 3617 从一个字符串s中头部或者尾部取同一个字符,加到字符串T中,要求字符串T的字典序最小。 对s和s的逆序s'进行比较。如果一样再对下一对进行比较,保证较小的字母较早被访问。 题源来自《挑战程序竞赛》第二版 43页。//// 043_best cow line.cpp// changlle//// Created by user on 12/原创 2015-12-27 10:40:01 · 295 阅读 · 0 评论 -
132_millionarie 百万赌博问题 (2008 APAC local onsite C)
开始有本金x,要进行p轮赌博,每一轮可以压一定数目的筹码。有p的概率获胜,如果获胜筹码翻一番,如果输了则筹码全部失去。 求m轮结束后手上钱超过一百万的概率。 由于本题的筹码可以是任何数字,所以是一个连续的变量,肯定不好求解,根据书上的分析,要想办法吧连续化为离散。 首先考虑自后一轮的情况: 1. 如果此时手上的钱少于50w的话,怎么样都不会赢,所以这个区间段概率为0; 2原创 2016-01-08 15:16:37 · 1119 阅读 · 4 评论 -
130_Bribe the Prisoners 囚徒贿赂问题 (2009 Round1C C)
一行监狱里面住着P个连续的囚徒,现在有一些囚徒需要释放,但是如果释放囚徒则需贿赂两边所有相邻的囚徒(直到遇到空位或者数组越界),求贿赂的最小值。 此题用动态规划来解决: dp[i] [j] 表示释放A(i) 到A(j)的所有囚犯,但不包括A(i) 和A(j),假定A(i) 和A(j)已经被释放,那么就形成两个空位。 释放期中一个囚徒,花费有如下三个方面组成: 1.自原创 2016-01-08 08:25:41 · 995 阅读 · 1 评论 -
107_Kruskal 最小生成树
最小生成树的Kruskal算法,用到了并查集来实现,并且对sort()函数进行了重载,实现比较简洁。 以下程序来自《挑战程序竞赛》第二版107页//// 107_Kruskal.cpp// changlle//// Created by user on 1/1/16.// Copyright (c) 2016 user. All rights reserv原创 2016-01-01 15:12:38 · 256 阅读 · 0 评论 -
106_Prime 最小生成树
最小生成树的Prime算法,用优先队列来实现。 《挑战程序竞赛》中, 使用一个min_cost数组来保存最小生成树倒每个结点的最短距离,每次操作对V进行循环; 对比了一下,以下程序,基于与最小生成树相连的边的优先队列,分析了一下不一定能占到便宜。//// 106_Prime.cpp// changlle//// Created by user on 1/1/16原创 2016-01-01 14:29:35 · 245 阅读 · 0 评论 -
099_二分图判定
只允许使用两种颜色,对图进行着色,相邻点的颜色一定要不同,问是否能成功。 比较经典的邻接表图算法。 用dfs来实现。对于每一个节点的邻接节点,依次进行dfs染色,若有一个染色失败(两个点颜色相同),就返回失败 对所有点循环过后,若没有失败,就返回成功。 例子里面的表来自《挑战程序竞赛》第二版98页。//// 099_binary garph.cpp// changl原创 2015-12-31 16:25:29 · 333 阅读 · 0 评论 -
088_食物链问题(并查集)
食物链问题:有N个动物,每个动物只能为A,B,C三种动物中的一种,已知 A吃B, B吃C, C吃A。 现在给出K条信息,每条信息值可能为以下两种中的一种: 1. x,y属于同一种动物; 2. x吃y。 要求找出这K 条信息中不正确的条数。 题源来自《挑战程序竞赛》第二版88页。 此题使用并查集来实现应该比较方便。 先初始化并查集,对于每一个动物x,创建三个元素:x,x+N,原创 2015-12-31 06:56:36 · 432 阅读 · 0 评论 -
STL set 与 map 实例
set://// 081_STL set.cpp// changlle//// Created by user on 12/30/15.// Copyright (c) 2015 user. All rights reserved.//#include #include using namespace std;int main () { se原创 2015-12-30 15:14:29 · 311 阅读 · 0 评论 -
077_木板切割问题(优先队列)
木板切割问题的优先队列实现方式。 在c++中,首先要定义一个从小到达的优先队列,参见c++代码。//// 077_fence repair(pq).cpp// changlle//// Created by user on 12/30/15.// Copyright (c) 2015 user. All rights reserved.//#include原创 2015-12-30 14:12:38 · 2079 阅读 · 0 评论 -
074_加油站问题(优先队列)
加油站问题,一辆车在每个加油站可以加一定数量的油,邮箱容量没有上限,走一个单位的路程消耗一个单位的油量,问汽车是否能够到达终点,如果可以,最少加几次油? 从这个角度思考问题较方便: 当汽车经过某个加油站时,只把油装在车上,并不加入油箱。等到油箱为空时再加油,与在加油站加油的效果一致。(《挑战程序竞赛》第二版的说法为获得一次加油的机会) 所以当油箱用尽时,选择最大的那桶油来加原创 2015-12-30 13:23:34 · 942 阅读 · 0 评论 -
068_多重集组合数
有n种物品, 第i只能怪物品有a[i]个。不同种类的 物品可以相互区分,但同一种类的物品无法相互区分,从中取出m个的话,求取的方案数。 题源来自《挑战程序竞赛》第二版 68页。 根据其定义,有如下DP数组: dp[i+1][j]=从前i个物品中取出j个的组合数。 为了从前i个物品中取出j个,可以这样实现:从前i-1种物品取出j-k种,再从第i种物品中取出k个,所以,有以下递推式:原创 2015-12-30 07:39:12 · 380 阅读 · 0 评论 -
067_划分数
有n个无差别物品,划分成不超过m组,求划分的方案个数。 此类DP 问题定义如下: dp[i][j]=j个物品的i划分的总数。 DP的时候分两部分讨论:如果划分没有某一组是空的,即正好划分成i组,所以每组至少可以拿出一个物品,即为dp[i][j-i]。 或者至少有一组是空的,即其划分数为dp[i-1][j]; so, dp[i][j]=dp[i][j-i]+dp[i原创 2015-12-29 17:40:12 · 289 阅读 · 0 评论 -
065_最长递增子序列
最长递增子序列,经典问题,有别于最长子序列问题,元素必须递增。 cse531 mid2的时候考过的问题,要求n^2, 某人做了个半对还沾沾自喜.........弱爆了。 这里给出nlogn的解法,《挑战程序竞赛》书中实例代码相当简洁优雅,三行搞定。 以下po c++ 代码。 //// 065_lasc.cpp// changlle//// Created by us原创 2015-12-29 16:37:32 · 481 阅读 · 0 评论 -
063_多重部分和问题(DP)
多重部分和问题:给定一组数,并且给定期中每个数出现的次数,试问是否存在这样的组合,使其和为一个值K?(某个数可以取多次,但不能超过其次数) 如:a={3,5,8} m={3,2,2} K=17; 即 数字3有3个,数字5有2个,数字8有2个。是否存在和为17的组合? 就此情况而言,存在3*3+8=17原创 2015-12-29 09:51:07 · 399 阅读 · 0 评论 -
169_线段树实现RMQ
线段树实现RMQ,书上的程序好像有点小问题,查询任意区间的时候会出现一些小错误。//// 169_S-Tree RMQ.cpp// changlle//// Created by user on 1/18/16.// Copyright (c) 2016 user. All rights reserved.//#include using namespace std;原创 2016-01-19 10:29:42 · 249 阅读 · 0 评论