自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

flyinghearts的专栏

flyinghearts#qq.com 新博客地址: www.cnblogs.com/flyinghearts

  • 博客(50)
  • 收藏
  • 关注

原创 多重背包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 38601 4

原创 编程之美读书笔记——目录

      最初看《编程之美》时,总觉得有些解法与自己的最初想法差得太多,于是就有了将自己的想法记下来的冲动。三个月下来,也才弄了十几篇,这些笔记都发给了该书的编辑。静下心来,翻翻自己所做的笔记,总觉得写得很杂乱,有不少错处,现将这些笔记贴出来,希望能得到大家的指正。   目录: 编程之美读书笔记_1.2_中国象棋将帅问题 编程之美读书笔记_1.3 一摞烙饼的排序 编程

2010-05-18 23:49:00 3230 2

原创 面试题: 找出数组中三个只出现一次的数

题目:数组中有三个数只出现一次,其它的数恰好出现两次,找出这三个数。     先考虑“只有两个数出现一次”的情况:可以找到一种方法,将数组划分为两部分,且让这两个数分别在不同部分,这样每部分所有数的异或值,恰好分别等于这两个数。一种简单的分法就是,先计算出这两个数的异或值M(等价于求数组中所有数的异或值),求出M值的二进制表示中的最低位1(其它位的1也可以,只不过麻烦点)在 +k位,然后根

2013-03-21 21:58:28 3671

原创 mingw gcc的头文件存在结构定义错误!!

准确的讲是mingw所用的sdk ——  w32api,存在结构定义错误。  打开wingdi.h 定位到 tagGCP_RESULTSW 的结构定义位置,   typedef struct tagGCP_RESULTSW {    DWORD lStructSize;    LPWSTR lpOutString;    UINT *lpOrder;    int

2013-03-21 21:47:46 1708

原创 面试题精解之二: 字符串、数组(1)

面试题精解之二: 字符串、数组(1) 本篇文章发表在下面三个博客中,如果出现排版问题,请移步到另一个博客。http://www.cppblog.com/flyingheartshttp://www.cnblogs.com/flyingheartshttp://blog.csdn.net/flyinghearts 1     在一个字符串中找到第一个只出现一次的字符,如输

2012-03-20 21:07:19 2835

原创 避免计算过程中出现溢出的一个技巧

先看一道面试题: 长度为n的数组,由数字1到n组成,其中数字a不出现,数字b出现两次,其它的数字恰好出现一次。怎样通过只读遍历一次数组,找出数字a和b。  由于只能遍历一次,在遍历数组arr时,算出 a和b的差值,以及a和b的平方差,通过解方程,即可求得a和b。具体做法为:设:      s1 = 1 + 2 + ... + n           (= n * (n

2012-03-20 21:05:23 5058

原创 Fibonacci数计算中的两个思维盲点及其扩展数列的通用高效解法

http://www.cppblog.com/flyingheartshttp://www.cnblogs.com/flyingheartshttp://blog.csdn.net/flyingheartspdf版本下载㈠ Fibonacci数刚接触Fibonacci数的时候,在网上看到“矩阵法”,看到要先实现一个矩阵乘法,感觉太麻烦了。后来仔细观察Fibonacc

2012-02-28 22:14:38 1199

原创 面试题精解之一: 二叉树

面试题精解之一: 二叉树 本篇文章发表在下面三个博客中,如果出现排版问题,请移步到另一个博客。http://www.cppblog.com/flyingheartshttp://www.cnblogs.com/flyingheartshttp://blog.csdn.net/flyinghearts 1     求二叉树中相距最远的两个节点之间的距离2     判断

2012-02-28 20:59:10 9372

原创 喝汽水问题

喝汽水问题                                                 by flyinghearts 有1000瓶汽水,喝完后每3个空瓶能换1瓶汽水,问最后最多可以喝几瓶汽水,此时剩余几个空瓶?  不妨假设,共有n瓶汽

2011-09-23 19:48:23 1441

原创 数组左旋转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 1362

原创 一道C++面试题的误区

一道很简单的题目,一般有下面4种解法:1 遍历两次,每次分别找出最小值和最大值。2 只遍历一次,每次取出的元素先与已找到的最小值比较,再与已找到的最大值比较。3 每次取两个元素,将较小者与已找到的最小值比较,将较大者与已找到的最大值比较。4 分治:将数组划分成两半,分别找出两边的最小值、最大值,则最小值、最大值分别是两边最小值的较小者、两边最大值的较大者。这4种算法,哪种效率最高,哪种最低?后两种算法只要进行1.5*N次比较,因而网上有不少解答都将它们列为最佳答案。但是,算法4用到了递归,而

2011-05-03 23:16:00 1953 1

原创 螺旋矩阵 之二

<br /> <br /> <br />问题<br />1 按顺时针方向构建(或螺旋访问)一个n * n的螺旋矩阵,效果见下图。<br />2 在不构造螺旋矩阵的情况下,给定坐标i、j值求其对应的值f(i, j)。<br />比如对6 * 6矩阵, f(2, 0) =19  f(2, 1) = 6<br /> <br /> <br />思路一<br />前一篇文章已经讨论了一类螺旋矩阵(由外向内),而这一类螺旋矩阵,则是由内向外扩散。这两类矩阵可以通过下面的方法相互转换。<br

2011-01-01 00:19:00 1433

原创 螺旋矩阵

<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 1118

原创 螺旋矩阵

<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 1272

原创 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 5335 4

原创 编程之美读书笔记_1.1_让CPU占用率曲线听你指挥

<br />题目:写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率。程序越精简越好,计算机语言不限。例如,可以实现下面三种情况:<br /> <br />1.    CPU的占用率固定在50%,为一条直线;<br />2.    CPU的占用率为一条直线,但是具体占用率由命令行参数决定(参数范围1~ 100);<br />3.    CPU的占用率状态是一个正弦曲线。<br /> <br />控制CPU占用率,不仅仅是出于好玩而已。以前的某些程序,特别是某些老游戏,

2010-12-02 23:17:00 1516

原创 N个数计算24点

<br />N个数计算24点<br />问题:<br />    N个1到13之间的自然数,找出所有能通过加减乘除计算(每个数有且只能用一次)得到24的组合?<br /> <br />计算24点常用的算法有:① 任取两个数,计算后,将结果放回去,再从剩下的数中任取两个,如此反复直到只剩下一个数;② 先构建前缀/后缀表达式,再计算该表达式;③ 用集合保存中间结果,集合间两两进行合并计算得到新集合(或者对给定的一个集合,对其所有的子集合进行合并计算)。<br />本文采用第一种方法。定义六种操作符:ADD、SU

2010-09-21 00:08:00 2986

原创 编程之美读书笔记_1.3 一摞烙饼的排序 (补充)

<br /> 几个月前写了 编程之美读书笔记_1.3 一摞烙饼的排序 , 对书上的例子{3,2,1,6,5,4,9,8,7,0},将搜索次数由原来的172126次降到29次,本以为要进一步降低搜索次数,要强化剪枝条件,要添加大量的代码,而实际上只要改动一处,就能将搜索次数降到11次。遍历所有可能的排列求第1个……第10个烙饼数所用的总时间,也由原来的38秒降到21秒。<br /> <br /> <br />改动:<br />1.3_pancake_final第148行<br />  for (int pos

2010-08-21 23:45:00 1676 1

原创 编程之美读书笔记22 1.16 24点游戏

<br />编程之美读书笔记22    1.16  24点游戏<br /> <br />给定4个数,能否只通过加减乘除计算得到24?由于只有4个数,弄个多重循环,就可以。如果要推广到n个数,有两种思路:<br />①采用前缀/后缀表达式。相当于将n个数用n-1个括号括起来,其数目就是一个catlan数。最多可得到f(n) = (1/n * (2*n - 2)! / (n-1)! / (n-1)!) * n! * 4^(n-1) = 4^(n-1) * (2*n-2)! / (n-1)! 种表达式,当n=4时

2010-08-01 22:49:00 1408

原创 《编程之美》读书笔记21: 2.4 1的数目

<br />《编程之美》读书笔记21: 2.4 1的数目<br /> <br />问题:<br />    给定一个十进制正整数N,写下从1开始,到N的所有整数,<br />    然后数一下其中出现的所有“1”的个数。<br />    例如:<br />      N=2,写下 1,2。这样只出现了 1 个“1”。<br />N=12,我们会写下 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样 1 的个数是 5。<br /> <br />    1. 写一个函数f(N)

2010-08-01 22:45:00 878

原创 深拷贝从“new”说起

2010-06-17 00:40:00 1643

原创 浅析类的“深拷贝”

㈠ new的基本知识:先说说new操作符:new有三种:new、operator new和placement new。 new是通过调用operator new这个库函数来实现内存分配的。new申请内存失败的话,会抛出异常std::bad_alloc,且返回值不为0,当然也可以指定不抛异常的new。直接new一个对象,对象是否初始化,与定义一个同类对象相似:new X;      //调用类X的默认构造函数new X(x)    //调用类X的构造函数用x来初始化。newint      //变量未被初始化

2010-06-16 00:40:00 2765 1

原创 3.1_计算字符串移位包含问题

<br />3.1_计算字符串移位包含问题<br /> <br />这是一道字符串匹配题。不知道C库的strstr采用什么算法。<br />对字符串匹配,最低效的是暴力搜索。稍好的是KMP算法,效率最高的则是BM算法。<br />该题特殊在于:目标串长度是匹配串的两倍。Sunday算法虽然在实际应用中效率很高,但仅限于匹配串比较短时。BM的某一变种算法(基于suffix automaton)倒是实现了预处理和搜索都是0(n)的,但是实现起来有点复杂。<br />  既然是判断是否移位包含,可以用两个数组,分

2010-06-15 23:13:00 1325

原创 微软面试题: 找出二叉树上任意两个结点的最近共同父结点。

<br /> <br />找出二叉树上任意两个结点的最近共同父结点。<br /> <br /> <br /> <br />要求两节点的最近共同父节点(LCA,lowest common ancestor),可以采用树的后序遍历。如果这两个节点不在一条线上,则它们必定分别在所求节点A的左子树和右子树上,后序遍历到第一个满足这个条件的节点就是所要求的节点A。另外,当这两个节点在一条线上,所求节点A则是这两个节点中层次最低的节点的父节点。<br /><br /><br />static bool lca(Node

2010-06-12 10:42:00 9098 7

原创 Trilogy公司的笔试题:用最少的步骤将数转为1

Trilogy公司的笔试题:如果n为偶数,则将它除以2,如果n为奇数,则将它加1或者减1。问对于一个给定的n,怎样才能用最少的步骤将它变到1。最简单的方法就是用DP。设f(n)为所用的最少步骤。根据定义可得:若n为偶数, f(n)=f(n/2) + 1;若n为奇数, f(n)= min(f(n-1), f(n+1)) +1                     = min(f((n-1)/2), f((n+1)/2)) +2或者: f(2*k)=f(k)+1  f(2*k+1)=min(f(k),f(k+

2010-06-12 10:15:00 2057 1

原创 编程之美读书笔记_2.5 寻找最大的K个数 测试代码

<br />//2.5_nth.cpp by flyinghearts#qq.com #include <iostream>#include <vector>#include <queue>#include <set>#include <utility>#include <algorithm>#include <ctime>#include <cassert>#include <cstdlib>using namespace std;const int

2010-05-31 23:59:00 1662

原创 编程之美读书笔记_3.9_重建二叉树

3.9_重建二叉树对根节点a以及先序遍历次序P和中序遍历次序I,查找a在I中的位置,将I分为两部分,左边部分的元素都在a的左子树上,右边的元素都在a的右子树上,因而可以确定a的左子树节点数和a的右子树节点数,再结合P,可以确定a的左孩子和右孩子,以及各个孩子的先序和中序遍历次序。由于已经知道节点数,可以事先分配好内存,可以按先序遍历次序连续存放节点。struct Node { Node* left; Node* right; char data;};void rebuild(c

2010-05-31 23:21:00 1495

原创 编程之美读书笔记_3.7_队列中取最大数操作问题

3.7_队列中取最大数操作问题若不使用C++新标准的右值引用,DeQueue的实现是低效的,因为要返回的元素,只能通过赋值操作,而不能通过引用。(书上的实现代码,竟然少了对EnQueue的实现!)思路:用一个辅助队列来记录最大元素(为节省空间,只记录其地址),当有一个元素入队,就将辅助队列尾端不大于该元素的全部出队后(注意相等的也要出队),再将该元素压入辅助队列,这样就保证,辅助队列从头到尾的元素是递减的,辅助队列头元素是当前队列的最大值。当有一个元素出队时,就与辅助队列的头部第一个元素所指的元素比较,如果

2010-05-31 23:12:00 1813

原创 编程之美读书笔记_2.16 求数组中最长递增子序列

2.16 求数组中最长递增子序列思路:每处理一个数,都可以将这个数插入到已经找到的某个递增子序列(假设包含无限个长度为0的空序列)后,使其长度增加1,处理完毕后,这些长度最大值即为所求。具有相同长度i+1的递增子序列,若这些序列的最后一个数最小值为min_v[i],其所在的序列为A,则若某个数能插入到序列A,必然能插入到其它相同长度的递增子序列,而能否插入到序列A,仅由min_v[i]值决定,因而只要维护min_v[i]值就够了。当前数必然可以插入到某个长度为j(0具体过程:用min_v[i]保存当前已找到

2010-05-31 23:07:00 1392

原创 编程之美读书笔记_3.8 求二叉树中节点的最大距离 和 3.10分层遍历二叉树 相关代码

//3.10_tree.cpp by flyinghearts#qq.com//3.8_求二叉树中节点的最大距离 和 3.10_分层遍历二叉树 测试例子#include#include#include#includeusing namespace std;struct Node { Node *left; Node *right; int

2010-05-25 23:58:00 1554

原创 编程之美读书笔记_3.10 分层遍历二叉树

3.10 分层遍历二叉树 看到Milo写的这篇文章,又翻了下书,发现书的代码(P253)有个瑕疵,每个节点值后面都会显示一个空格,如果将间隔字符改为“-”,输出的每行最后都有一个“-”,不能达到要求。不过,只要将 cout data 这行改为:if (cur==last-1) cout data else cout data 即可修正这个问题。 书上的代码用了

2010-05-25 23:55:00 1943

原创 从10G个整数中找出中位数

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 从 10G 个整数中找出中位数

2010-05-25 22:51:00 6317

原创 编程之美读书笔记_1.9 高效率的安排见面会

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 1.9 高效率的安排见面会

2010-05-25 22:48:00 2289 2

原创 浏览器的兼容性呀

     碰到一个奇怪的现像,有很多文章只能显示最后的几段话,但编辑时又都显示完整。刚开始以为是网站的问题。于是将文章拆成了两部分,或者稍微编辑后再发,总算解决了一部分文章的显示问题,但有篇文章老是显示不完整,整了半天,最后用tw打开网址,发现显示没问题,用op打开也没问题,再用ff,还是显示不完整。看来是ff(3.6.3,只装了tab mix lite插件)的问题了。

2010-05-20 01:33:00 756

原创 编程之美读书笔记_1.3 一摞烙饼的排序_程序源代码

 1.3_pancake.cpp //1.3_pancake.cpp by flyinghearts#qq.com#include#include#include#includeusing namespace std;class Pancake{ vector cake; //当前各个烙饼的状态 vector cake

2010-05-20 00:38:00 1608

原创 编程之美读书笔记_2.5 寻找最大的K个数

2.5 寻找最大的K个数从n个数中寻找最大的k个数,两种思路:1 保存目前找到的最大k个数,每访问一个数,就与这k个数中的最小值比较,决定是否更新这k个数。储存k个数的数据结构可采用:败者树、二叉查找树、最小堆。C++ STL提供了multiset和priority_queue容器,另外还提供了make_heap,push_heap,pop_heap方便手动构建堆结构。(测试发

2010-05-20 00:21:00 2576

原创 编程之美读书笔记_4.5_磁带文件存放优化

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <! /* Style

2010-05-19 00:13:00 1267

原创 编程之美读书笔记_4.4_是否在三角形内

<! v/:* {behavior:url(#default#VML);}o/:* {behavior:url(#default#VML);}w/:* {behavior:url(#default#VML);}.shape {behavior:url(#default#VML);}--> Normal 0 7.8 磅 0 2

2010-05-19 00:13:00 1578

原创 编程之美读书笔记_4.1_金刚坐飞机问题

4.1_金刚坐飞机问题 对问题一,每个人都是随机选择座位,任意一个人坐在指定座位的概率相同,因而第i个乘客坐在其座位的概率是 1/n。 对问题二,答案和金刚的原来座位编号有关。不妨先去除金刚的座位,将乘客(根据机票号)和剩下的座位,按原大小顺序从1开始重新编号。用F(i,n)表示在新排列中(共有n-1个乘客座位和金刚原来的座位),新的第i个乘客坐在其原来座位的概率,则在n个座位中,

2010-05-19 00:13:00 2283

原创 编程之美读书笔记_3.8 求二叉树中节点的最大距离

Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 <! /* Style

2010-05-19 00:13:00 3860 6

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除