荷马史诗BZOJ4198
思路
题干在这:BZOJ4198
Huffman编码,没啥好说的
ac代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<cstring>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
struct word {
ll deep;
ll fre;
friend bool operator <(const word& a, const word& b) {
return a.fre == b.fre ? a.deep > b.deep :a.fre > b.fre;
}
};
priority_queue<word> huffman;
int main() {
ll n, k;
cin >> n >> k;
for (ll i = 0; i < n; i++) {
word x;
scanf_s("%lld", &x.fre);
x.deep = 0;
huffman.push(x);
}
if ((n - 1) % (k - 1) != 0) {
for (ll i = 0; i < k - 1 - (n - 1) % (k - 1); i++) {
word x = { 0,0 };
huffman.push(x);
}
}
ll minlen = 0, all = 0;
while ((ll)huffman.size() != 1) {
word x;
x.deep = x.fre = 0;
for (int i = 0; i < k; i++) {
x.deep = max(x.deep, huffman.top().deep);
x.fre += huffman.top().fre;
huffman.pop();
}
x.deep++;
minlen = x.deep;
all += x.fre;
huffman.push(x);
}
cout << all << endl << minlen;
}