测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A27370. 过河问题

填空题 较易

题目描述

过河问题

题目描述

有 n 个人要渡河,但只有一条小船,这条小船一次只能坐下最多两个人,并且只有一副船桨。每个人划船的速度不一样,如果两个人一起上船,由于重量变大,划船的速度基本上相当于是划船速度最慢的那个人速度。假设给出每个人单独划船过河所花费的时间 Ti,请问所有人都过河的总时间最短的时间?

输入格式

输入两行,第一行是一个整数,表示要过河的 n 个人。

第二行,是 n 个整数,按速度从快到慢排序好的每个人划船过河的时间。

输出格式

输出一行,给出所有人过河所花费最短的时间。

样例输入 1

3
1 2 3

样例输出 1

6

样例输入 2

4
1 2 5 10

样例输出 2

17

注意事项

请严格按要求输出,不要多余的打印语句,例如:“输入 x=...” 等多余内容。

本程序的代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main 函数需要返回 0。

注意: 只使用 ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

注意: 所有依赖的函数必须明确地在源文件中 #include<xxx>, 不能通过工程设置而省略常用头文件。

参考答案

#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int a[n+5]; for(int i=1; i<=n; i++) cin>>a[i]; sort(a+1,a+n+1); int s=0; while(n>=4) { if(2*a[1]+a[n-1]+a[n]>2*a[2]+a[1]+a[n]) { s+=2*a[2]+a[1]+a[n]; } else s+=2*a[1]+a[n-1]+a[n]; n-=2; } if(n==3) s+=a[1]+a[2]+a[3]; else if(n==2) s+=a[2]; else s+=a[1]; cout<<s<<endl; return 0; }
上一题 下一题