多元Huffman编码问题
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
在一个操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次至少选2 堆最多选k堆石子合并成新的一堆,合并的费用为新的一堆的石子数。试设计一个算法,计算出将n堆石子合并成一堆的最大总费用和最小总费用。
对于给定n堆石子,计算合并成一堆的最大总费用和最小总费用。
Input
输入数据的第1 行有2 个正整数n和k(n≤100000,k≤10000),表示有n堆石子,每次至少选2 堆最多选k堆石子合并。第2 行有n个数(每个数均不超过 100),分别表示每堆石子的个数。
Output
将计算出的最大总费用和最小总费用输出,两个整数之间用空格分开。
Sample Input
7 3 45 13 12 16 9 5 22
Sample Output
593 199
#include<bits/stdc++.h>
using namespace std;
struct cmp
{
bool operator ()(long long a, long long b)
{
return a > b;//小值优先
}
};
int main()
{
int n, k;
//ios::sync_with_stdio(false);
cin >> n >> k;
priority_queue <long long, vector<long long>, greater<long long> > minHeap;//小值优先
priority_queue <long long, vector<long long>, less<long long> > maxHeap;//默认,大值优先
//priority_queue<long long, vector<long long>, cmp> q;//自定义
for(int i = 0; i < n; i++)
{
int t;
cin >> t;
minHeap.push(t);
maxHeap.push(t);
}
long long resSum1 = 0;
long long resSum2 = 0;
long long testSum = 0;
while(maxHeap.size() > 1)
{
testSum = 0;
testSum += maxHeap.top();
maxHeap.pop();
testSum += maxHeap.top();
maxHeap.pop();
resSum2 += testSum;
maxHeap.push(testSum);
}
cout << resSum2 << " ";
while(minHeap.size() > 1)
{
testSum = 0;
int t = k;
while(!minHeap.empty() && t > 0)
{
testSum += minHeap.top();
t--;
minHeap.pop();
}
resSum1 += testSum;
minHeap.push(testSum);
}
cout << resSum1 <<endl;
return 0;
}