Fruta combinada (cola de prioridad clásica)

Fruta combinada (cola de prioridad clásica)

https://www.luogu.com.cn/problem/P1090

Descripción del Título

En un huerto, Duoduo ya había derribado todas las frutas y las había dividido en diferentes montones según los diferentes tipos de frutas. Duoduo decidió combinar todas las frutas en una sola pila.

Cada vez que se fusiona, Toto puede fusionar dos pilas de frutas y la energía consumida es igual a la suma del peso de las dos pilas de frutas. Se puede ver que después de que todas las frutas se fusionan n − 1 veces, solo queda una pila. La resistencia total consumida por Duoduo al fusionar frutas es igual a la suma de la resistencia consumida por cada fusión.

Debido a que se necesita un gran esfuerzo para llevar estas frutas a casa, Duoduo debería ahorrar la mayor cantidad de energía posible al fusionar las frutas. Suponiendo que el peso de cada fruta es 1 y que se conoce la cantidad de tipos de fruta y la cantidad de cada fruta, su tarea es diseñar un plan de secuencia combinada para minimizar la cantidad de esfuerzo físico que consume Duoduo y generar el valor mínimo de esfuerzo físico.

Por ejemplo, hay 3 tipos de frutas, los números son 1, 2, 9 en orden. Puede fusionar 1 y 2 pilas primero, el número de pilas nuevas es 3 y el esfuerzo físico es 3. Luego, combine la nueva pila con la tercera pila original y obtenga una nueva pila con un número de 12 y un esfuerzo físico de 12. Entonces Dato consume un total de fuerza física = 3 + 12 = 15. Se puede demostrar que 15 es el costo físico mínimo.

Formato de entrada

Hay dos líneas.
La primera línea es un número entero n (1≤n≤10000), que indica el número de tipos de frutas.

La segunda línea contiene n enteros, separados por espacios, el i-ésimo entero ai a_iunyoEs el número de la i-ésima fruta.

Formato de salida

Un número entero, que es el costo físico mínimo. Ingrese datos para asegurarse de que este valor sea menor que 2 32 2 ^ {32}23 2

Entrada y salida de muestra

Ingrese # 1

3 
1 2 9 

Salida # 1

15

Instrucciones / consejos

Para el 30% de los datos, se garantiza que n≤1000:

Para el 50% de los datos, se garantiza que n≤5000;

Para todos los datos, se garantiza que n≤10000.

responder

Similar al árbol binario óptimo, el más pequeño y el más pequeño se fusionan continuamente.

En este momento, es muy conveniente utilizar la cola de prioridad, cada vez que el encabezado de la cola es el más pequeño, el segundo es el segundo más pequeño.

Saque los dos primeros números cada vez, agréguelos y colóquelos en la cola

Luego hasta que se forme una pila.

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;//小顶堆,升序队列 
int main()
{
	int n,temp1,temp2,t=0;
	cin>>n;
	int a[n+5];
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		q.push(a[i]);
	}
	int k=1;
	while(k<n)
	{
		temp1=q.top();
		q.pop();
		temp2=q.top();
		q.pop();
		q.push(temp1+temp2);
		t=t+temp1+temp2;
		k++;
	}
	cout<<t<<endl;
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/hhuhgfhggy/article/details/109277123
Recomendado
Clasificación