问题描述:某晚上,有N个人要过河,只有一支手电筒,每个人过河的时间不同,且每次最多只能有两个人一起过河。求N个人一起过河的最短时间。
问题分析:emm...在做题之前,我们不妨来看一下这个题目的规律:
首先他们过河是有两种方式的,一种是直接过河时间最短的那个人把其余的人一个一个护送过去(贪婪);另外一种就是,过河时间比较短的两个人先过去,然后回来一个,然后是过河时间计较长的两个人过去,再让刚刚过去的过河时间较短的另外一个回来,重复此过程(动态规划)。
这两种方式是要结合一起使用的,第一种是适合过河时间第二快的人的过河时间的二倍比过河时间第一快加上过河时间第二慢的总和小的情况(也就是(a[1]*2<a[0]+a[i-1]));其余适合第二种。
接着要注意的是,过河人数奇偶数的不同也会造成结果的差异,所以还是分开写。
源码如下:
package daily;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要过桥的人数 :");
int n = scanner.nextInt();
System.out.println("请输入每个人过桥的时间:");
int a[] = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = scanner.nextInt();
}
Main main = new

本文分析了一个经典面试题——如何在只有一个手电筒的情况下,使N个人以最短时间过河。通过讨论贪婪算法和动态规划策略的结合,探讨了奇偶数人数的不同解决方案,并提供了Java源码实现,强调考虑所有情况以获取最优解。
最低0.47元/天 解锁文章
836

被折叠的 条评论
为什么被折叠?



