摘要:
实际上,用树的后序遍历就可以了。当访问到所求的节点A时,如果这两个节点不在一条线上,则它们必定分别在A的左子树和右子树上,后序遍历到第一个满足这个条件的节点就是所要求的节点A。另外,还必须对这两个节点在一条线上的情况,做特殊处理。代码: staticboollca(Node*root,intva,intvb,Node*&result,Node*parrent){//left/right左/右子树是否含有要判断的两节点之一boolleft=false,right=false;if(!result&&root-left)left=lca(root-left,va,vb,result,root 阅读全文
posted @ 2011-01-01 00:13
flyinghearts
阅读(2947)
评论(0)
推荐(0)
摘要:
Trilogy公司的笔试题: 如果n为偶数,则将它除以2,如果n为奇数,则将它加1或者减1。问对于一个给定的n,怎样才能用最少的步骤将它变到1。 例如:n=11: ① ++n - 12 ② n/2 - 6 ③ n/2 - 3 ④ --n - 2 ⑤ n/2 - 1 共需5步。 最简单的方法就是用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)= 阅读全文
posted @ 2011-01-01 00:12
flyinghearts
阅读(450)
评论(0)
推荐(0)
摘要:
多重背包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种物品的数目可以是:0、1、2……,可得: 阅读全文
posted @ 2011-01-01 00:10
flyinghearts
阅读(1014)
评论(4)
推荐(1)
摘要:
问题: 一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马? 思路: 先将25匹马分成五组,进行五场比赛。第六场比赛可以考虑都取各个小组的第一名(或第二名)。假设都取各小组的第一名,根据这场比赛的排名,将原来的小组分别编号为a、b、c、d、e,并将原来的25匹马分别编号为: a1b1c1d1e1 a2b2c2d2e2 a3b3c3d3e3 a4b4c4d4e4 a5b5c5d5e5 其中Xi,X表示组的编号,i为在该组的排名,则有:a1 b1 c1 阅读全文
posted @ 2011-01-01 00:05
flyinghearts
阅读(1434)
评论(2)
推荐(1)

浙公网安备 33010602011771号