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
*/