![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 78
flyinghearts
这个作者很懒,什么都没留下…
展开
-
多重背包O(N*V)算法详解(使用单调队列)
多重背包问题:有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件。怎样装才能使背包内的物品总价值最大?网上关于“多重背包”的资料倒是不少,但是关于怎么实现O(N*V)算法的资料,真得好少呀,关于“单调队列”那部分算法,又没说明得很清楚,看了几遍没看懂原理,只好自己动脑去想怎么实现O(N*V)算法。若用F[i][j]表示对容量为j的背包,处理完前i种物品后,背包内物品可达到的最大总价值,并记m[i] = min(n[i], j / v[i])。放入背包的第i种物品的数目可原创 2010-09-20 23:41:00 · 38703 阅读 · 4 评论 -
Fibonacci数计算中的两个思维盲点及其扩展数列的通用高效解法
http://www.cppblog.com/flyingheartshttp://www.cnblogs.com/flyingheartshttp://blog.csdn.net/flyingheartspdf版本下载㈠ Fibonacci数刚接触Fibonacci数的时候,在网上看到“矩阵法”,看到要先实现一个矩阵乘法,感觉太麻烦了。后来仔细观察Fibonacc原创 2012-02-28 22:14:38 · 1204 阅读 · 0 评论 -
喝汽水问题
喝汽水问题 by flyinghearts 有1000瓶汽水,喝完后每3个空瓶能换1瓶汽水,问最后最多可以喝几瓶汽水,此时剩余几个空瓶? 不妨假设,共有n瓶汽原创 2011-09-23 19:48:23 · 1442 阅读 · 0 评论 -
一道C++面试题的误区
一道很简单的题目,一般有下面4种解法:1 遍历两次,每次分别找出最小值和最大值。2 只遍历一次,每次取出的元素先与已找到的最小值比较,再与已找到的最大值比较。3 每次取两个元素,将较小者与已找到的最小值比较,将较大者与已找到的最大值比较。4 分治:将数组划分成两半,分别找出两边的最小值、最大值,则最小值、最大值分别是两边最小值的较小者、两边最大值的较大者。这4种算法,哪种效率最高,哪种最低?后两种算法只要进行1.5*N次比较,因而网上有不少解答都将它们列为最佳答案。但是,算法4用到了递归,而原创 2011-05-03 23:16:00 · 1957 阅读 · 1 评论 -
数组左旋转k位 —— C++标准算法库中最悲剧的函数:rotate
<br /> <br />要将一个数组的所有元素向左旋转k位,通常有三种算法:<br /> <br />算法1(分组交换):<br />若a长度大于b,将ab分成a0a1b,交换a0和b,得ba1a0,只需再交换a1 和a0。<br />若a长度小于b,将ab分成ab0b1,交换a和b0,得b0ab1,只需再交换a和b1。<br />不断将数组划分和交换,直到不能再划分为止。分组过程与求最大公约数很相似。<br /> 读写内存各 n到2*n次<br /> <br />算法2 (三次反转)<br />利用ba原创 2011-05-27 21:08:00 · 1367 阅读 · 0 评论 -
螺旋矩阵
<br />问题<br />1 按顺时针方向构建一个m * n的螺旋矩阵(或按顺时针方向螺旋访问一个m * n的矩阵):<br />2 在不构造螺旋矩阵的情况下,给定坐标i、j值求其对应的值f(i, j)。<br />比如对11 * 7矩阵, f(6, 0) = 27 f(6, 1) = 52 f(6, 3) = 76 f(6, 4) = 63<br /> <br /> <br />构建螺旋矩阵<br />对m * n 矩阵,最先访问最外层的m * n的矩形上的元素,接着再访问里面一层的 (m - 2)原创 2010-12-23 23:19:00 · 1119 阅读 · 0 评论 -
螺旋矩阵
<br />问题<br />1 按顺时针方向构建一个m * n的螺旋矩阵(或按顺时针方向螺旋访问一个m * n的矩阵):<br />2 在不构造螺旋矩阵的情况下,给定坐标i、j值求其对应的值f(i, j)。<br />比如对11 * 7矩阵, f(6, 0) = 27 f(6, 1) = 52 f(6, 3) = 76 f(6, 4) = 63<br /> <br /> <br />构建螺旋矩阵<br />对m * n 矩阵,最先访问最外层的m * n的矩形上的元素,接着再访问里面一层的 (m - 2)原创 2010-12-23 23:17:00 · 1281 阅读 · 0 评论 -
25匹马取前5
<br /><br />问题: <br />一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马?<br /> <br />思路:<br />先将25匹马分成五组,进行五场比赛。第六场比赛可以考虑都取各个小组的第一名(或第二名)。假设都取各小组的第一名,根据这场比赛的排名,将原来的小组分别编号为a、b、c、d、e,并将原来的25匹马分别编号为:<br />a1 b1原创 2010-12-03 21:31:00 · 5343 阅读 · 4 评论 -
N个数计算24点
<br />N个数计算24点<br />问题:<br /> N个1到13之间的自然数,找出所有能通过加减乘除计算(每个数有且只能用一次)得到24的组合?<br /> <br />计算24点常用的算法有:① 任取两个数,计算后,将结果放回去,再从剩下的数中任取两个,如此反复直到只剩下一个数;② 先构建前缀/后缀表达式,再计算该表达式;③ 用集合保存中间结果,集合间两两进行合并计算得到新集合(或者对给定的一个集合,对其所有的子集合进行合并计算)。<br />本文采用第一种方法。定义六种操作符:ADD、SU原创 2010-09-21 00:08:00 · 3011 阅读 · 0 评论 -
面试题: 找出数组中三个只出现一次的数
题目:数组中有三个数只出现一次,其它的数恰好出现两次,找出这三个数。 先考虑“只有两个数出现一次”的情况:可以找到一种方法,将数组划分为两部分,且让这两个数分别在不同部分,这样每部分所有数的异或值,恰好分别等于这两个数。一种简单的分法就是,先计算出这两个数的异或值M(等价于求数组中所有数的异或值),求出M值的二进制表示中的最低位1(其它位的1也可以,只不过麻烦点)在 +k位,然后根原创 2013-03-21 21:58:28 · 3681 阅读 · 0 评论