一道简单的k叉霍夫曼树,注意要用无符号长整形啊啊!!64位整数!!!不然会re的!!
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef unsigned long long ll;
struct nodee
{
ll value, path;
};
bool operator<(const nodee &a, const nodee &b)
{
if (a.value == b.value)
{
return b.path < a.path;
}
return b.value < a.value;
}
priority_queue<nodee, vector<nodee> >que;
int n, k;
ll realans, realpathh;
int main()
{
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++)
{
nodee a;
scanf("%lld", &a.value);
a.path = 0;
que.push(a);
}
while ((n - 1) % (k - 1) != 0)
{
nodee a;
a.value = a.path = 0;
que.push(a);
n++;
}
while (que.size()>= k)
{
ll tempvalue, temppath;
tempvalue = temppath = 0;
for (int i = 0; i < k; i++)
{
nodee a;
a = que.top();
que.pop();
tempvalue += a.value;
temppath = max(temppath, a.path);
}
nodee b;
realans += tempvalue;
realpathh = max(realpathh, temppath+1);
b.value = tempvalue;
b.path = temppath + 1;
que.push(b);
}
printf("%llu\n%llu\n", realans, realpathh);
return 0;
}