【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出】
输出t行数据,每行1个数,表示每组过河最少时间。
【输入样例】
1
4
1 2 5 10
【输出样例】
17
#include
using namespace std;
int t, n;
int a[1000];
int main() {
cin >> t;
while (t--) {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
sort(a + 1, a + 1 + n);
int ans = 0;
//这种策略至少需要4个人
while (n >= 4) {
//两种策略取最优
//当前剩余的人中,最快的 分两趟带最慢的a[n],a[n-1]
int time1 = (a[n] + a[1] + a[n - 1] + a[1]);
//最快的a[1]和次快的a[2]先过去,然后最快的a[1]回来,a[n-1]和a[n]再过去,a[2]再回来
int time2 = (a[2] + a[1] + a[n] + a[2]);
ans += min(time1, time2);
//已经运走剩下的人中,最慢的和次慢的了
n -= 2;
}
if (n == 3) {
//第一种策略最优
ans += (a[n] + a[1] + a[n - 1]);
} else if (n == 2) {
//直接过
ans += a[2];
}
cout << ans << endl;
}
return 0;
}