【题目描述】
几个人过河,每次过两人一人回,速度由慢者决定,问过河所需最短时间。
【输入】
输入t组数据,每组数据第1行输入n,第2行输入n个数,表示每个人过河的时间。
【输出】
输出t行数据,每行1个数,表示每组过河最少时间。
【输入样例】
1
4
1 2 5 10
【输出样例】
17
思路:原文链接:https://blog.csdn.net/qq_40575034/article/details/103364590
第一种最快的人1带动慢的n和n-1,这样运过n和n-1共需要A1+An+A(n-1)+A1时间。
第二种:最快的1先和次快的2过去,然后最快的1回来,让n和n-1一起过去,然后让刚开始去的2回来,时间为A2+A1+An+A2。
看一下这两种哪一种时间小,也就是说比较 A(n-1)+A1与2A2的关系。
总之,每组操作之后,在岸对面留下的都是慢的人,因为不要让他们回来,所以回来的都是快的。
第一种时间T1=a[n]+2a[1]+a[n-1];
第二种时间T2=a[2]*2+a[1]+a[n];
比较这俩时间就是比较 a[1]+a[n-1]; *a[2]2!
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int t; cin >> t;
int a[1001];
for (int i = 1; i <= t; i++)
{
int n; cin >> n;
memset(a, 0, sizeof(a));
for (int j = 1; j <= n; j++)
cin >> a[j];
sort(a + 1, a + n + 1);
int s = n;
long int sum = 0;
while (s != 2 && s != 3&&s!=1)
{
sum = sum + min(2 * a[2], a[s-1] + a[1]) +a[1]+ a[s];
s = s - 2;
}
if (s == 2)//两个人的时候就是a1 a2
sum = sum + a[2];
if (s == 3)//三个人的时候是 a1a2a3 这个时候只能用第一种方法!
sum = sum + a[s] + a[s - 1] + a[1];
cout << sum << endl;
}
}