过桥问题 pascal

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过桥问题 pascal相关的知识,希望对你有一定的参考价值。

试题描述
U2合唱团共有N个人,他们必须在T分钟内赶到演唱会场,途中必需跨过一座狭窄而且没有护栏的桥,当他们抵达桥边时天色已经漆黑,如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,他们一共只带了一只手电筒,而桥窄得只够让两个人同时过去。N个人的步行速度各不相同,若两人同行过桥,所需要的时间就是走得比较慢的那个人单独过桥时所需的时间。现在告诉你每个人单独过桥所需要的时间,请你判断他们能否在规定时间内顺利过桥从而安全准时地抵到演唱会场。
特别需要说明的是:过桥的时候必须持有手电筒,所以就要有人把手电筒带来带去,来回穿梭于桥的两端。手电筒是不允许象扔手榴弹一样扔过桥的,这样做显然太危险了,甚至比过桥还危险。
输入要求
第一行两个整数N和T,N≤20,T≤200。
第二行N个整数表示每个人过桥所需要的时间,保证每个人所需要的时间都不超过20。
输出要求
一行,‘Yes’或者‘No’表示答案,引号不要输出。
输入样例
4 17
1 2 5 10
输出样例
Yes
知识点及提示
1和2过桥,1将手电筒送回来,用时3
5和10过桥,2将手电筒送回来,用时12
1和2过桥,用时2
本题为防退场题,有相当大的难度,通过的同学将有幸获得谷歌公司提供的奖品。请合理规划你的编程策略,总成绩名列前茅者也将获得谷歌公司提供的奖品。
最后给你一个提示:每次将手电筒送回来的人一定是已经过桥的人中速度最快的那位!并且只可能是所有人中速度最快的两个人之一。

参考技术A 这个题目其实是很明显的贪心策略,主题思想就是,永远找最快的人陪.
不过有几个陷阱情况需要特判,这个你要好好自己想想.
举几个例子 100 100 1 1,这个就不能按永远用1陪的思路了,因为最后可以让100和100自己过去.
具体说,4个人(a,b,c,d),假设时间a<=b<=c<=d
判断:
if a+c<=2*b then
(a,d) a (a,c) b (a,b)
else
(a,b) a (c,d) b (a,b)

其他情况都直接让最快那个当电灯泡就行了.

过桥问题

题目:在一个夜黑风高的晚上,有n(n <= 50)个小朋友在桥的这边,现在他们需要过桥,但是由于桥很窄,每次只允许不大于两人通过,他们只有一个手电筒,所以每次过桥的两个人需要把手电筒带回来,i号小朋友过桥的时间为T[i],两个人过桥的总时间为二者中时间长者。问所有小朋友过桥的总时间最短是多少。

输入:

两行数据:第一行为小朋友个数n

                   第二行有n个数,用空格隔开,分别是每个小朋友过桥的时间。

输出:

一行数据:所有小朋友过桥花费的最少时间。

 

样例:

输入

4

1 2  5 10

输出

17

分析:

动态规划的线性模型

假设r[n]存储第i个人的速度(0~n-1)

分析可知有一些人要充当“跑腿”的作用,而“跑腿”又是在已经到对岸的人中选择,因此直觉上应该让速度快的人先过桥,于是我们将所有人的速度升序排序,依次考虑。

1.假设现在河两边各有一群人,到了送第i个人过河的阶段了,手电筒在对岸,我们需要选择“跑腿”,选择速度最快的人,这一定是最优决策,因此让r[0]回来。

2.此时河这边有r[0],r[i]~r[n-1],但此时让r[0]陪同r[i]过桥就不一定是最优决策了,因为r[i]与r[0]是否实力相差过于悬殊?r[0]会被拖累。

另一种策略是让r[i]和r[i+1]一起过桥,之后再由对岸选择一个“跑腿”(即r[1],此时他最快),然后由r[1]回来,r[1]和r[0]再一同过桥,这样让两个实力均衡的人一起,不会亏太多。

我们应该在以上两种策略中择优。

状态转移方程dp[i] = min{dp[i-1] + r[0] + r[i] , dp[i-2] + r[0] + r[i] + 2*r[1] }

注意上述决策的基本要求是,河对岸有大于等于两个人。因此要考虑基本情况

初始化dp[1]=r[1];dp[2]=r[2];dp[3]=r[2]+r[1]+r[3];

若输入人数小于等于3,则直接输出。

 

以上是关于过桥问题 pascal的主要内容,如果未能解决你的问题,请参考以下文章

小明一家过桥问题

四个人17分钟过桥的问题

过桥问题

在夜里,有4个人要过桥,他们过桥分别要10分钟,5分钟,2分钟,1分钟,有1个手电,一次只能过两个,最短多长能过桥

回帖精选:游戏常用算法问题——小明过桥问题

解决N个人过桥时间最短问题(Java版本)