Transcript 2 其他

赖荣凤
提纲
HELP JIMMY
场景中包括多个长度和高度各不相同
的平台。地面是最低的平台,高度为
零,长度无限。
Jimmy老鼠在时刻0从高于所有平台的
某处开始下落,它的下落速度始终为1米/秒。当
Jimmy落到某个平台上时,游戏者选择让它向左还是
向右跑,它跑动的速度也是1米/秒。当Jimmy跑到平
台的边缘时,开始继续下落。Jimmy每次下落的高度
不能超过MAX米,不然就会摔死,游戏也会结束。
HELP JIMMY
用动态规划来解,整个问题可分成两子问题:
•从Jimmy下方第一个平台左端到地面的最短时间
•从Jimmy下方第一个平台右端到地面的最短时间
HELP JIMMY
给每个平台进行编号,并按高度排好序。第k个平台
左端到地面的最短时间记为LeftMinTime(k),从右端
到地面的最短时间记为RightMinTime(k)。
LeftMinTime(k) = ∞; k平台下方是地面且 H(k)>Max
LeftMinTime(k) = H(k); k平台下方是地面且 H(k)<=Max
k平台下方是m平台
LeftMinTime(k) = H(k) - H(m) + Min(LeftMinTime(m)
+ X1[k] - X1[m], RightMinTime(m) + X2[m] - X1[k])
雷达系统
如上图,x轴下方是陆地,上方是海洋,x轴表示海
岸线,在海洋上有一些小岛。现在要在海岸线上安
装一些雷达,每个雷达能覆盖半径为d的圆形区域
(包括边界)。现给出所有小岛的坐标,请你最少
需要安装多少个雷达才能覆盖所有小岛?
雷达系统
用贪心法来解这题:
1. 将各个小岛按横坐标排序,从小到大编号;
2. 将第1个雷达置于最左端,然后向右挪直到它刚好
覆盖第一个小岛;
3. 将第1个雷达覆盖的小岛从 待覆盖小岛集合中删除,
重复第2步,直到覆盖所有小岛。
雷达系统
用归纳法简单证明这种解法是正确的:
小岛数s = 1时,算法正确;
假设s = k时算法也能找到最优解;
s = k + 1 时 小岛{ D1, D2, …, Dk+1}。
算法用雷达a1 覆盖第一个岛D1,剩下的岛数目小于k
用贪心法可得最优解A’。
A = A’ ∪{a1} 是原问题的最优解!若不然,假设存在最
优解R={r1, r2,…,rn} ,其中ri是按雷达横坐标排序。
那么:X(a1)>=X(r1), 因为如果X(a1)<X(r1), 则r1不能覆盖
第1个小岛,这与R是最优解矛盾。
将r1右移到a1处,不改变解的最优性。同样的可以将
{r2,r3,…,rn}转化为A’。即得证。
求和为k的子集
从x0开始累加,直到累加和为负;然后重新开始累加。 选择最
大的累加和。描述:假定给你一个如同黑盒的算法,你看不到
它是如何设计的,它有如下性质:如果输入任意一串实数以及
一个整数k,算法将会回答“yes”或“no”,以指出是否存在一个
子集其总和恰好为k。说明如何用黑盒找到这个总和为k的子集。
如果存在的话。允许你使用这个黑盒 O(n)次(其中n为这串实数
的规模)。
设函数ksum(a, s, e, k)可以判断一个实数数组a中从第s个元素到
第e个元素间(包括s,但不包括e)的实数组成的集合中是否存
在和为k的子集。根据提示中的ksum函数,给出调用ksum为O(n)
次的算法,求出一个和为k的子集。
注:本题测试数据保证满足条件的子集是唯一的。
求和为k的子集
If(ksum(a, 2, n, k) )
a[1]被排除;
Else
a[1]属于这个子集,接下来看ksum(a, 3, n,
k-a[1])
社会名流问题
在n个人中,一个被所有人知道但却不知道别人的人,
被定义为社会名流。
现在的问题是如果存在,试找出该社会名流。你可以
使用的唯一方式是询问:“请问你知道那个人吗?”
请给出提问次数为O(n)的算法。
定义数组R[n][2],R[i][0]记录i所认识的人数,R[i][1]记
录认识i的人数。
对每行输入(每行一对数字i和j,表示i认识j )
R[i][0]++; R[j][1]++;
最后找出R[i][0] ==0 R[i][1] == n的人就是名流
最大和子序列
令x0, x1, ..., xn-1是一串实数(不需要一定为正
数)。设计一个O(n)的算法,寻找子序列xi,
xi+1, ..., xj,使得它们的和在所有子序列和中最
大。空子序列的和定义为0。
从x0开始累加,直到累加和为负;然后重新开
始累加。 选择最大的累加和。
最大和子序列
j
{ xk }
用动态规划法解:令 b[ j ]  max
1i j
k i
b[j] 表示最后一项为a[j] 的序列构成的最大的子段和
最优解为b[1], b[2], ..., b[n]中的最大值
递推方程为
b[j]= max{b[j-1]+a[j],a[j]} j=1,2,…,n