Problema de codificación multivariante de Huffman

Descripción del problema: Hay n pilas de piedras colocadas alrededor de un patio de recreo, ahora las piedras deben combinarse en una pila de manera ordenada. Se estipula que cada vez se seleccionan al menos 2 pilas y como máximo k pilas de piedras y se combinan en una nueva pila, y el costo de la combinación es el número de la nueva pila de piedras. Calcule el costo total máximo y el costo total mínimo de combinar n pilas de piedras en una pila.


Diseño de algoritmo: Para n pilas de piedras dadas, calcule el costo total máximo y el costo total mínimo combinados en una pila.
Entrada de datos: Hay 2 números enteros positivos n y k en la primera línea del archivo, lo que significa que hay n pilas de piedras, y se seleccionan al menos 2 pilas y como máximo k pilas de piedras cada vez. Hay n números en la segunda fila, que representan el número de piedras en cada pila.
Ejemplo de entrada:
7 3
45 13 12 16 9 5 22
Ejemplo de salida:
593199 

Idea: Utilice la pila más grande para elegir las dos pilas más grandes a la vez, y el total es el costo máximo. Utilice el montón más pequeño para seleccionar el montón más pequeño de k cada vez, y el total es el más pequeño. (no sé por qué)

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int main()
{
	int n, k;
	while (cin >> n >> k)
	{
		vector<int>v;
		v.push_back(0);
		priority_queue<int, vector<int>, less<int>>p;
		priority_queue<int, vector<int>, greater<int>>q;
		for (int i = 1; i <=n; i++)
		{
			int num;
			cin >> num;
			v.push_back(num);
			p.push(num);
			q.push(num);
		}
		
		int max_sum=0, top;
		while (p.size() > 1)
		{
			top = p.top();
			p.pop();
			top+=p.top();
			p.pop();
			max_sum += top;
			p.push(top);
		
		}
		int min_sum = 0;
		while (q.size() > k)
		{
			top = 0;
			for (int i = 0; i < k; i++)
			{
				top += q.top();
				q.pop();

			}
			q.push(top);
			min_sum += top;

		}
		while (q.size())
		{
			top = q.top();
			min_sum += top;
			q.pop();
		}
		cout << "maxs_sum: " << max_sum << "min_sum: " << min_sum << endl;
	}

	return 0;
}
/*
7 3
45 13 12 16 9 5 22

*/

 

Supongo que te gusta

Origin blog.csdn.net/weixin_40823740/article/details/109370227
Recomendado
Clasificación