题目链接:http://uva.onlinejudge.org/external/126/12676.pdf
题型:数据结构
题意:
话说这题目可真长,读了两三遍不知道啥意思。。。
关于字符串转换为哈夫曼树的,题意太绕,我说不明白了,,,,
分析:
直接上分析,采用优先队列,按照先层数后权值的二级排序,当前层的叶子节点的值取下一层的节点中的最大值,推到最后就可以得出答案。
注意用long long,这里被坑了一下。。。
代码:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<vector>
#define LL long long
using namespace std;
int n;
struct Node{
int id;
LL value;
friend bool operator < (Node A,Node B){
if(A.id == B.id){
return A.value < B.value;
}
return A.id < B.id;
}
}a[60];
LL MAXN[60];
priority_queue<Node> q;
int main(){
while(~scanf("%d",&n)){
while(!q.empty()) q.pop();
int MAX = -1;
for(int i=0;i<n;i++){
scanf("%d",&a[i].id);
a[i].value = -1;
q.push(a[i]);
MAX = max(MAX,a[i].id);
}
memset(MAXN,0,sizeof(MAXN));
MAXN[MAX] = 1;
LL sum = 0;
while(!q.empty()){
// printf("%d===>%d\n",q.top().id,q.top().value);
Node s1,s2;
s1 = q.top();
q.pop();
if(q.empty()){
sum = s1.value;
break;
}
s2 = q.top();
q.pop();
if(s1.id == MAX && s2.id == MAX){
s1.value = 1;
s2.value = 1;
}
else{
if(s1.value == -1){
s1.value = MAXN[s1.id+1];
}
if(s2.value == -1){
s2.value = MAXN[s2.id+1];
}
}
Node ts;
ts.id = s1.id - 1;
ts.value = s1.value + s2.value;
q.push(ts);
MAXN[ts.id] = max(MAXN[ts.id],ts.value);
}
printf("%lld\n",sum);
}
return 0;
}
/*
2
1 1
4
2 2 2 2
10
8 2 4 7 5 1 6 9 3 9
*/