问题:

在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。

输入:

第一行是一个整数T(1<=T<=20)表示测试数据的组数

每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河

每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0

输出:

输出所有人都过河需要用的最少时间。

样例输入:

1

4

1 2 5 10

样例输出:

17

思路分析:

我们可以根据示例的输出去反推我们选取的策略是不是最优。先假设这四个人是A、B、C、D。那解这道题的一个很自然的想法就是每次让跑得最快的A陪着另一个过桥,然后A快速地跑回来,再陪下一位过去,最后所有人就都可以过桥了。 让我们来算一下这要多长时间。为了方便起见,我们把旅行者出发的桥的这一边称为“此岸”,而把旅行者想要到达的那边叫“彼岸”。在表达一个过桥方案时,我们用“←”来表示从彼岸到此岸的移动,用“→”表示从此岸到彼岸的移动。前面“A护送大家过河”的方案就可以写成:(右边数字为完成此步骤所需时间)。

A B → 2

A ← 1

A C → 5

A ← 1

A D → 10

所用时间为2 + 1 + 5 + 1 + 10 = 19大于17说明这种情况下这种策略是不行的。但其实有更快的办法:

A B → 2

A ← 1

C D → 10

B← 2

A B → 2

所用时间为2 + 1 + 10 + 2 + 2 = 17与测试用例相吻合说明这这种策略对于这种情况下是适合的。

这个办法的聪明之处在于让两个走得最慢的人同时过桥,这样花去的时间只是走得最慢的那个人花的时间,而走得次慢的那位就不用另花时间过桥了。那这样的策略是不是就一定适合所有的策略呢,我们在这样的情况下就要多举出几个例子来证明自己的观点。我们可以举出 1 2 2 9 来看下,可以发现第一种方案其实是比第二种方案更快。说明这个跟测试用例的输入是有关系的,我们不知道在什么情况下哪种方案最优所以我们需要将我们自己选择的较优的两种方案进行比较选择出花费时间较少的那组。

代码:

1 importjava.util.Arrays;2 importjava.util.Scanner;3

4 public class快速渡河 {5

6 public static voidmain(String[] args) {7 Scanner sc = newScanner(System.in);8 int T =sc.nextInt();9 for (int i = 0; i < T; i++) {10 int n =sc.nextInt();11 int[] speed = new int[n];12 for (int j = 0; j < n; j++) {13 speed[j] =sc.nextInt();14 }15 //排序

16 Arrays.sort(speed);17 f(n, speed);18 }19 }20

21 private static void f(int n, int[] speed) {22 int left =n;23 int ans = 0;24 while (left > 0) {25 if (left == 1) {//只有1人

26 ans += speed[0];27 break;28 } else if (left == 2) {//只有两人

29 ans += speed[1];30 break;31 } else if (left == 3) {//有三人

32 ans += speed[2] + speed[0] + speed[1];33 break;34 } else{35 //1,2出发,1返回,最后两名出发,2返回

36 int s1 = speed[1] + speed[0] + speed[left - 1] + speed[1];37 //1,3出发,1返回,1,4出发,1返回,1,2过河

38 int s2 = speed[left - 1] + speed[left - 2] + 2 * speed[0];39 ans +=Math.min(s1, s2);40 left -= 2;//左侧是渡河的起点,left代表左侧的剩余人数

41 }42 }43 System.out.println(ans);44 }45

46 }

结果:

总结一下:

贪心策略简单来说就是猜出最优的策略,然后再去证明这个策略是否最优,反之换一种策略继续证明,那证明的过程往往是很困难的,我们可以采用反证的方式,然后多举例证明策略是否成立。贪心算法的难点就是选取最优策略,还要判断当前最优是不是整体最优。有时候方案只有一种,有时候方案有很多种,很多种的情况下,我们就需要对其进行比较,因为在某些情况下这种策略是最优的,有些情况下,另外一种策略是最优的,通过比较最终得到的肯定是最优的方案。

多人过河问题C语言贪心算法,贪心算法----过河问题相关推荐

  1. 智力过河游戏c语言,Flash制作的智力过河小游戏(附代码)

    游戏规则: 一只大狮子,一只小狮子,一只大老虎.一只小老虎.一只大花豹,一只小花豹要到河对面去,只有大动物和小老虎会划船,船每次只能乘两只动物.大动物之间互相吃不了,小动物之间互相吃不了,如果大动物不 ...

  2. 贪心算法:小船过河问题

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

  3. Algorithm:C++语言实现之贪心法算法相关问题

    Algorithm:C++语言实现之贪心法算法相关问题 目录 一.贪心法 一.贪心法 1.LIS的算法分析

  4. 狼羊菜过河问题c语言算法,算法系列之十四:狼、羊、菜和农夫过河问题

    题目描述:农夫需要把狼.羊.菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊.请考虑一种方法,让农夫能够 ...

  5. 夫妻过河 c语言程序,毕业论文求解夫妻过河问题7喜欢就下吧(全文完整版)

    <(毕业论文)求解夫妻过河问题.doc>由会员分享,可免费在线阅读全文,更多与<(毕业论文)求解夫妻过河问题(7)(喜欢就下吧)>相关文档资源请在帮帮文库(www.woc88. ...

  6. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  7. Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS、深度优先DFS,最短路径SPF、带负权的最短路径Bellman-ford、拓扑排序)

    Algorithm:C++语言实现之图论算法相关(图搜索广度优先BFS.深度优先DFS,最短路径SPF.带负权的最短路径Bellman-ford.拓扑排序) 目录 一.图的搜索 1.BFS (Brea ...

  8. 基础算法 —— 贪心算法

    [概述] 贪心算法是从问题的初始状态出发,通过若干次的贪心选择而得到的最优值的一种求解策略,即贪心策略. 简单来说,贪心策略是一种在每次决策时采取当前意义下最优策略的算法,做出的选择至少在某种约束条件 ...

  9. 相关算法---贪心算法

    贪心算法 1. 理论基础 贪心的本质就是选择每一阶段的局部最优,从而达到全局最优. 使用贪心最好的策略就是举反例,如果想不到反例,就试一试贪心. 刷题或者面试的时候,手动模拟一下感觉可以局部最优推出整 ...

  10. c语言算法有效性,BerForest—C语言学习笔记-《算法》

    这是我学习C语言的笔记,也可以算是回忆录,反正有利于我的学习,也可以让C语言的新手借鉴. 许多人都在盲目的学习编程,其实学习编程无为就是学习一些编程语法.即使学会了,也不一定能够自己独立的编写出程序了 ...

最新文章

  1. MySQL数据备份语句
  2. js基于lodash实现前端防抖与节流
  3. 在网页中插入百度地图的那些事
  4. how drop down list description is displayed by UI framework
  5. Asp.Net Core 轻松学-利用日志监视进行服务遥测
  6. 【Spring】Spring 如何更改动态更改运行中某个类的日志级别
  7. vs调试linux多线程,VS2017多线程调试
  8. java lombok 插件_idea 安装 lombok 插件
  9. mysql的关系表_MySQL表关系总结
  10. mac 生成公私钥key
  11. 蓝鸽智慧计算机教室云服务平台操作说明,智慧教室操作说明.PDF
  12. 教你做一个最简版的倒计时计时器,新手也能秒懂。
  13. 使用selenium自动登录126/163邮箱并自动发送邮件
  14. Unity3D坦克大战
  15. C# 验证码生成照码编程之后
  16. 小学生计算能力测试系统设计
  17. Linux VPS服务器根据CPU负载及内存占用自动重启的bash shell脚本
  18. 计算机教育部第四次学科评估结果,权威重磅!教育部公布全国第四轮学科评估结果!...
  19. Jquery 小程序
  20. cf489c Given Length and Sum of Digits...

热门文章

  1. 因果推断6--多任务学习(个人笔记)
  2. 顶点计划——关于“拒绝”的调研报告
  3. dsgnintf.dcu 找不到的解决方案(原)
  4. SuperMap iClient3D for WebGL之查询模型属性
  5. 让你的微信公众平台中支持QQ在线客服功能
  6. 异地办公移动管理平台
  7. 服务器上的文件如何查看,如何查询服务器上的文件来源
  8. 计算机网络管理-实验5-安装试用SNMPc网络管理软件
  9. linux 查看CPU频率
  10. 2003服务器php套件,PHP套件FastCGI版发布,支持WindowsServer2003_护卫神