ACM算法之小船过河问题
来源:互联网 发布:哀其不幸 怒其不争知乎 编辑:程序博客网 时间:2024/04/29 20:04
过河问题
时间限制:1000 ms | 内存限制:65535 KB
描述
在漆黑的夜里,N位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,N个人一共只带了一只手电筒,而桥窄得只够让两个人同时过。如果各自单独过桥的话,N人所需要的时间已知;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,如何设计一个方案,让这N人尽快过桥。
输入
第一行是一个整数T(1<=T<=20)表示测试数据的组数
每组测试数据的第一行是一个整数N(1<=N<=1000)表示共有N个人要过河
每组测试数据的第二行是N个整数Si,表示此人过河所需要花时间。(0<si<=100)< p="">
输出
输出所有人都过河需要用的最少时间
样例输入
- 1
- 4
- 1 2 5 10
样例输出
- 17
来源
NYOJ47
练了几天ACM,今天首次尝试难度系数为5的题,结果就被难住了,因为从样例输入怎么都想不到如何才能够让最短时间为17。甚至开始怀疑题目有问题,但觉得还是不太甘心,百度了一下,才发现是自己太想当然,其实如果能够拿纸笔画一画就知道是怎么回事了。
思路如下:
先将数组S按过河时间从小到大排好序。
- 当N为1时,答案自然直接为S1
- 当N为2时,答案则是速度慢的一个,即S2
- 当N为3时,由速度最快的与其中一个先过河,速度快的回来,再与另一个过河,时间为S1 + S2 + S3
- 当N大于3时,问题开始变得复杂起来,我们需要寻找一个固定的规律,才能够将问题简单化,由于过桥需要有人将手电筒带回原岸,返程的必定是速度叫快的一个,即速度快的可能往返多次,因此由速度快的开始计算时间必然会非常复杂,而速度最慢的过河之后必定不会再回程,因此我们从速度慢的先考虑,先将速度慢的送过河。但此时可能出现两种情况:
- 由于同时可以过两个人,因此可以考虑最快的与次快的过河,最快的回来,最慢的与次慢的过河,次快回来,以此节省次慢的过河时间,则最慢、次慢的过河时间为 S2 + S1 + Sn + S2
- 而另一种最容易考虑到的自然是最快的送最慢的过河,然后最快的回来,此时次慢变为最慢,再让最快的送其过河,最快再回来……那么最慢、次慢的过河时间为 Sn + S1 + Sn-1 + S1
即简化为送最慢的两个人先过河,在这两种情况中取花费时间最少的方式,规模缩小为n - 2的同一问题
代码如下:
- #include<stdio.h>
- #include<algorithm>
- using namespace std;
- int s[100];
- int main(){
- int t, n;
- scanf("%d", &t);
- while(t--){
- scanf("%d", &n);
- for(int i = 0; i < n; ++i){
- scanf("%d", s + i);
- }
- sort(s, s + n);
- int time = 0;
- while(n > 3){
- int time1 = s[1] + s[0] + s[n - 1] + s[1];
- int time2 = s[n - 1] + s[0] + s[n - 2] + s[0];
- time += time1 < time2 ? time1 : time2;
- n -= 2;
- }
- if(n == 3){
- time += s[0] + s[1] + s[2];
- }else if(n == 2){
- time += s[1];
- }else if(n == 1){
- time = s[0];
- }
- printf("%d\n", time);
- }
- return 0;
- }
0 0
- ACM算法之小船过河问题
- 贪心之小船过河问题
- 小船过河问题
- 贪心算法实例(五):小船过河问题
- 算法之----过河/过桥问题
- acm过河问题
- 过河问题(ACM)
- 南工ACM:过河问题
- 贪心算法之 nyoj47过河问题
- C语言贪心算法之过河问题
- 回溯算法---过河问题
- 【算法编程】过河问题
- 算法-过河问题
- 贪心算法--过河问题
- SDAU 贪心专题 14 小船过河
- 算法系列之三:妖怪与和尚过河问题
- 算法系列之三:妖怪与和尚过河问题
- 算法系列之三:妖怪与和尚过河问题
- SSH无密钥登陆
- Adrod Studo环境配置与安装
- 3GPP 首个5G标准
- Simplify Path
- 数组函数的练习。
- ACM算法之小船过河问题
- C++抽象编程——递归简介(4)——斐波那契函数的分析与扩展
- java.lang.Class类详解
- Android Monkey 压力测试
- c++ string
- sublime 安装使用
- vm-vm网络配置问题
- 费用流模版
- 关于透视变换的映射关系 warpPerspective