同学在面试时遇到了一个有趣的编程题,笔者很有兴趣,故以此文章作为记录。

题目:

N个人过河,船每次只能坐两个人,船载每个人过河的所需时间不同t[i],每次过河的时间为船上的人的较慢的那个,问最快的过河时间。(船划过去要有一个人划回来)。

首先分析下场景,我们首先要考虑的是如何把耗时最长的人送过去,而题目中明确说明了每次计时都要以较慢的记,我们很容易想到,让最慢的两个人一起过,是比较好的策略。展开分析,发现可能的情况有两种。

情况1:让最快的两个人和最慢的两个人组成一组,我们按照耗时长短分为a,b,c,d。要把cd送到对面,总共分4步(其中ab回对岸,是为了接其他剩下的人过河,因为他们是耗时最短的两个人):

第一步:a,b过河  ------ 耗时 b

第二步:a留在对岸,b回去  ------ 耗时 b

第三步:c,d过河  ------ 耗时 d

第四步:a开船回来  ------ 耗时 a

总耗时为:a + 2 * b + d

但我们发现,其中b是需要计算两次的,这时如果四个值分别为 1,2,9,10,使用这种策略的耗时为:1 + 2*2+10 = 15;

如果四个值分别为 1,8,9,10,使用这种策略的耗时为:1 + 8*2+10 = 27;显然这种情况当b耗时较大的时候不是最优策略,我们如果使用下面的策略,耗时会更短。

情况2:让最快的人带耗时最久的两个人过河,即把4人一组改为3人一组,我们按照耗时长短分为a,c,d。要把cd送到对面,总共分4步(同理,其中a回对岸,是为了接其他剩下的人过河,因为他是耗时最短的人):

第一步:a,c过河 ------ 耗时为c

第二步:a 回来 ------ 耗时为a

第三步:a,d过河 ------ 耗时为 d

第四步:a回来 ------ 耗时为a

总耗时为 : a *2  + c + d

这种策略下,刚才的情况: 如果四个值分别为 1,8,9,10的耗时为 1 * 2  + 9 + 10 = 21 < 27, 比策略1优。

我们知道了这两种策略,就不难根据两种策略写出代码:

思路为:首先排序,得到耗时由小到大的数组,然后每次判断两种策略哪种更优,把总时间累加即可。

需要考虑边界条件:当数组剩余长度为3时,此时的耗时为 a + b + c(此时a不需要再回对岸接其他人了,已经没有其他人了);

当数组剩余长度为2:耗时为 b,因为他是两个人中耗时较长的。

这样,整个流程就结束了。

Python代码示例:

# -*- coding: utf-8 -*-
def bridge(times):times.sort()n = len(times)ret = 0 while n > 3:#策略1t1 = times[0] + 2 * times[1] + times[n - 1]#策略2t2 = times[0] * 2 + times[n - 1] + times[n - 2]temp = t1 if t1 < t2 else t2ret += temp#当前未过河的耗时最长的两个人已经过河,所以要减2n -= 2#特殊情况,剩3个人时,耗时最短的已经不用回来了,直接留在对岸if n == 3:t = times[0] + times[1] + times[2]ret += treturn ret #特殊情况,取耗时较长的if n == 2:t = times[1]ret += treturn ret times = [2,10,12,11]
times = [2,7,3,8]
print bridge(times)

java代码示例:

import java.util.Arrays;public class Bridge {/*** 过桥问题.*/public static int bridge(int[] times) {Arrays.sort(times);int result = 0;int leftNum = times.length;while (leftNum > 3) {int cost1 = times[0] + 2 * times[1] + times[leftNum - 1];int cost2 = times[0] * 2 + times[leftNum - 1] + times[leftNum - 2];int temp = cost1 < cost2 ? cost1 : cost2;result += temp;leftNum -= 2;}if (leftNum == 3) {result += times[0] + times[1] + times[2];return result;}if (leftNum == 2) {result += times[1];}return result;}public static void main(String[] args) {int[] times = {2, 7, 3, 8};System.out.println(Bridge.bridge(times));}
}

启发:遇到问题是先思考有哪些情况,有哪些策略,然后将问题拆解为处理的最小单元。

以上代码仅为参考,由于笔者水平有限,难免有理解不当之处,欢迎大家批评指正。

经典小船过河问题,附Python,java题解相关推荐

  1. 手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16(附python源代码及数据库)——改变世界经典人工智能项目实战(一)手把手教学迁移学习

    手把手带你从0完成医疗行业影像图像检测三大经典模型InceptionV3-RestNet50-VGG16 1.迁移学习简介 2.项目简介 3.糖尿病视网膜病变数据集 4.考虑类别不平衡问题 5.定义模 ...

  2. Java经典面试题总结(附答案)-java经典面试题大全总结以及整理

    前言  最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油吧. 目录 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.final 在 java ...

  3. 蓝桥杯实战应用【算法代码篇】-耐摔指数(附Python、Java和C++代码)

    目录 问题描述 解题思路 代码实现 Python Java C++ 问题描述 x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局 ...

  4. 10 种机器学习算法的要点(附 Python 和 R 代码)(转载)

    10 种机器学习算法的要点(附 Python 和 R 代码)(转载) from:https://zhuanlan.zhihu.com/p/25273698 前言 谷歌董事长施密特曾说过:虽然谷歌的无人 ...

  5. 教程 | 理解和实现自然语言处理终极指南(附Python代码)

     教程 | 理解和实现自然语言处理终极指南(附Python代码) 时间 2017-02-16 14:41:39 机器之心 原文  http://www.jiqizhixin.com/article ...

  6. 机器学习算法一览(附python和R代码)

     机器学习算法一览(附python和R代码) 来源:数据观 时间:2016-04-19 15:20:43 作者:大数据文摘 "谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能 ...

  7. python 覆盖list_这套python 面试题你还没有?保证让你面试通关《附Python源码+实战项目》...

    随着Python在企业中的应用越来越多,岗位需求越来越大,面试成为了搞定优质职位的快速方式,下面是笔者面试10余家企业总结的面试题,希望对Python从业者有帮助. 介绍一下Python的数据结构,并 ...

  8. 贪心算法实例(五):小船过河问题

    N个人过河,船每次只能坐两个人,船载每个人过河的所需时间不同t[i],每次过河的时间为船上的人的较慢的那个,问最快的过河时间.(船划过去要有一个人划回来)     最优选择:       先将所有人过 ...

  9. OpenCV函数应用:基于二值图像的三种孔洞填充方法记录(附python,C++代码)

    系列文章目录 函数系列: OpenCV函数简记_第一章数字图像的基本概念(邻域,连通,色彩空间) OpenCV函数简记_第二章数字图像的基本操作(图像读写,图像像素获取,图像ROI获取,图像混合,图形 ...

最新文章

  1. crontab 定时任务配置
  2. Couchbase 介绍 - 更好的 Cache 系统
  3. 第六篇:python基础之文件处理
  4. [SCOI2009]最长距离
  5. SQL之Sort的组合查询
  6. 基于人脸识别的课堂签到管理系统(五)---启动/结束签到,以及在百度智能云创建用户组
  7. 关于命令行启动MySQL服务的相关问题
  8. 多线程实现飞花令-多诗库版
  9. 方剂学(综合练习)题库【1】
  10. coldfusion php,将一些PHP移植到ColdFusion
  11. MySQL中GA、RC、Alpha的区别
  12. np.random.binomial()
  13. python模拟登录钉钉,Python—实现钉钉后台开发
  14. 报警后签了和解协议,还能反悔吗
  15. STM32学习——入门小项目
  16. 支付宝当面付打shang系统源码分享
  17. 深度学习(9) 计算机专业方面的期刊介绍
  18. uvm_tlm通信篇总结
  19. 使用深度学习进行三维脑肿瘤分割
  20. css实现实心三角形、有边框的三角形和空心三角形

热门文章

  1. 怎么用迅捷PDF转换器在线修改图片大小
  2. [stm32 HAL库] RTC和BKP驱动
  3. 计算机基本操作评课记录,《Word的基本操作》评课稿--李存业
  4. java实现一台电脑控制多台手机_一台电脑控制多部手机怎么实现?
  5. 【二维数组】方阵主对角线元素对换
  6. 数据结构易混点、易错点、题目(个人向)
  7. 用户体验设计师(UE)职务描述。
  8. 这些行业已经开始用数据挖掘了,我们的前途光明
  9. idea中的一些有趣的插件
  10. TikTok全球下载突破超20亿人次,它做对了什么?