经典面试题《提灯过河》分析及Java源码

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

问题描述:某晚上,有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[] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值