Crossing River (Olimpiada de informática One Pass-T1232)

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. 只有 1 个人: La hora de cruzar el río es a[1];
  2. 只有 2 个人: La hora de cruzar el río es a[2];
  3. 只有 3 个人: La hora de cruzar el río es a[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;

  1. 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;
  2. a 带 c,a 回来;a 带 d,a 回来; El tiempo de cruce de este programa es c + a + d + a, a saber 2a + c + d;
  3. a 带 b,a 回来;c 带 d,b 回来; El tiempo de cruce de este programa es b + a + d + b, a saber 2b + a + d;
  4. 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;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46239370/article/details/113846806
Recomendado
Clasificación