Descripción del tema
Varias personas cruzan el río, dos personas cada vez, la velocidad la determina el más lento, pregunte el menor tiempo requerido para cruzar el río.
Formato de entrada
Ingrese t grupos de datos,
ingrese n en la
primera fila de cada grupo de datos e ingrese n números en la segunda fila, que representan el tiempo que cada persona cruza el río.
Formato de
salida Salida t filas de datos, 1 número por fila, que representa el tiempo mínimo para que cada grupo cruce el río.
Ejemplo de entrada
1
4
1 2 5 10
Salida de muestra
17
Solución de problemas
Codiciosos:
一、当人数 ≤ 3 时
:
只有 1 个人
: La hora de cruzar el río esa[1]
;只有 2 个人
: La hora de cruzar el río esa[2]
;只有 3 个人
: La hora de cruzar el río esa[1] + a[2] + a[3]
;
二、当人数 > 3 时
: Cada vez que las dos personas más lentas cruzan el río, hay dos formas de cruzar el río;
- Suponga que el cruce más rápido del río es a, el siguiente más rápido es b, el siguiente más lento es c y el más lento es d;
a 带 c,a 回来;a 带 d,a 回来
; El tiempo de cruce de este programa esc + a + d + a
, a saber2a + c + d
;a 带 b,a 回来;c 带 d,b 回来
; El tiempo de cruce de este programa esb + a + d + b
, a saber2b + a + d
;- Tome el valor mínimo para los dos esquemas de cruce de ríos cada vez;
#include <iostream>
#include <algorithm>
using namespace std;
int n, T;
int a[1010];
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;
while(n > 3)
{
int sum1 = a[1] * 2 + a[n] + a[n - 1];
int sum2 = a[2] * 2 + a[1] + a[n];
ans += min(sum1, sum2);
n -= 2;
}
if(n == 1) ans += a[1];
else if(n == 2) ans += a[2];
else ans += a[1] + a[2] + a[3];
cout << ans << endl;
}
return 0;
}