过河问题
Posted peppa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了过河问题相关的知识,希望对你有一定的参考价值。
题目描述
有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸。而东岸边有一条小船。
船太小了,一次只能乘坐两人。每个人都有一个渡河时间T,船划到对岸的时间等于船上渡河时间较长的人所用时间。
现在已知N个人的渡河时间T,Oliver想要你告诉他,他们最少要花费多少时间,才能使所有人都过河。
注意,只有船在东岸(西岸)的人才能坐上船划到对岸。
输入输出格式
输入格式:
输入文件第一行为人数N,以下有N行,每行一个数。
第i+1行的数为第i个人的渡河时间。
输出格式:
输出文件仅包含一个数,表示所有人都渡过河的最少渡河时间
输入输出样例
输入样例#1:
4 6 7 10 15
输出样例#1:
42
说明
[数据范围]
对于40%的数据满足N≤8。
对于100%的数据满足N≤100000。
[样例解释]
初始:东岸{1,2,3,4},西岸{}
第一次:东岸{3,4},西岸{1,2} 时间7 第二次:东岸{1,3,4},西岸{2} 时间6 第三次:东岸{1},西岸{2,3,4},时间15 第四次:东岸{1,2},西岸{3,4} 时间7 第五次:东岸{},西岸{1,2,3,4} 时间7
所以总时间为7+6+15+7+7=42,没有比这个更优的方案。
假设有4个人过河(T1<T2<T3<T4),有这样两种策略;
①让用时最短的T1来回渡船,总时间为T2+T1+T3+T1+T2
②1和2过河,1回来,3和4过河,2回来,1和2过河
用时T2+T1+T4+T2+T1
这样的两种方法哪个更优要根据具体时间来定
代码:
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,t[100100],sum; 5 int main() 6 { 7 scanf("%d",&n); 8 for(int i = 1;i <= n;i++) scanf("%d",&t[i]); 9 sort(t+1,t+n+1); 10 while(n >= 4) 11 { 12 if(t[1] + t[n-1] > 2*t[2]) 13 { 14 sum += 2 * t[2] + t[1] + t[n]; 15 } 16 else 17 { 18 sum += 2 * t[1] + t[n] + t[n-1]; 19 } 20 n-=2; 21 } 22 if(n == 3) 23 { 24 sum += t[1] + t[2] + t[3]; 25 } 26 else if(n == 2) 27 { 28 sum += t[2]; 29 } 30 else 31 { 32 sum += t[1]; 33 } 34 printf("%d ",sum); 35 return 0; 36 }
以上是关于过河问题的主要内容,如果未能解决你的问题,请参考以下文章