树-堆结构练习——合并果子之哈夫曼树oj
树-堆结构练习——合并果子之哈夫曼树
Problem Description
Input
Output
Example Input
3 1 2 9
Example Output
15
Hint
Author
哈夫曼做法(还可用动规和堆做)
#include <stdio.h> #include <stdlib.h> #define Max 30000 int a[Max]; struct node {int weight;int parent,l,r; }L[Max];int main() {int n,m,i,j;scanf("%d",&n);m = 2*n-1; // printf("%d\n", (1<<31-1)); //建树for(i = 1;i <= n;i++){scanf("%d",&L[i].weight);}for(i = 1;i <= m;i++){L[i].parent = L[i].l = L[i].r = 0;}for(i = n+1;i<=m;i++){int p1,p2,s1,s2;p1 = p2 = 0,s1 = s2 =1e9; //权值回合并,for(j = 1;j <= i-1;j++){if(L[j].parent == 0){if(L[j].weight < s1){p2 = p1;p1 = j;s2 = s1;s1 = L[j].weight;}else if(L[j].weight < s2){s2 = L[j].weight;p2 = j;}}}L[p1].parent = i;L[p2].parent = i;L[i].l = p1;L[i].r = p2;L[i].weight = L[p1].weight + L[p2].weight;}long long int num,sum; num = sum = 0;for(i = 1;i <= n;i++){num = 0;j = i;while(L[j].parent != 0){num++;j = L[j].parent;}sum += L[i].weight * num;}printf("%lld\n",sum);return 0; }
堆
#include <stdio.h>
int a[100010];
void HeapAdjust(int low,int hight)//建堆
{
int i;
int t = a[low];
for(i = 2*low;i <= hight;i*=2)
{
if(i<hight&&a[i+1]<a[i])
i++;
if(t > a[i])
{
a[low] = a[i];
a[i] = t;
}
else
break;
low = i;
}
}
int shan(int low,int hight)//删除low为删除序号hight为堆元素个数
{
int t,i;
t = a[low];
a[low] = a[hight];
a[hight] = t;
t = a[low];
for(i = 2*low;i <= hight-1;i*=2)
{
if(i<hight-1&&a[i+1]<a[i])
i++;
if(t > a[i])
{
a[low] = a[i];
a[i] = t;
}
else
break;
low = i;
}
return hight-1;
}
int jia(int num,int hight)//添加元素,num为添加数大小,hight为堆元素个数
{
int i;
a[hight+1] = num;
for(i = (hight-1)/2;i > 0;i/=2)
{
if(num < a[i])
{
a[i] = num;
a[hight] = a[i];
}
else
break;
hight = i;
}
return hight+1;
}
int main()
{
int i,n;
scanf("%d",&n);
// {
for(i = 1;i <= n;i++)
{
scanf("%d",&a[i]);
}
for(i=n/2;i>0;i--) //建堆
HeapAdjust(i,n);
int num = 0;
int m = n;
int sum;
for(i = 0;i < m-1;i++) //计算
{
num+=a[1];
sum = a[1];
n = shan(1,n);
num+=a[1];
sum+=a[1];
n = shan(1,n);
n = jia(sum,n);
}
printf("%d\n",num);
// }
return 0;
}
树-堆结构练习——合并果子之哈夫曼树oj相关推荐
- SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...
- 树-堆结构练习——合并果子之哈夫曼树
树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...
- 树-堆结构练习——合并果子之哈夫曼树(是最优二叉树题目的缩影)
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个果园里,多多已经将所有的果子 ...
- 树-堆结构练习——合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descrip
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descrip ...
- L - 树-堆结构练习——合并果子之哈夫曼树
L - 树-堆结构练习--合并果子之哈夫曼树 题目链接: link. 题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合 ...
- java合并果子_C++(STL)树-堆结构练习——合并果子之哈夫曼树
priority_queue 对于基本类型的使用方法相对简单. 他的模板声明带有三个参数,priority_queue Type 为数据类型, Container 为保存数据的容器,Functiona ...
- sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列
Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...
- Vijos P1097 合并果子【哈夫曼树+优先队列】
描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- 哈夫曼树编码和译码c语言,C++哈夫曼树编码和译码的实现
78 /*-----------创建工作---------------------------*/ 79 int s1,s2; 80 for (int i = n + 1; i < ...
最新文章
- 语音识别、传统语音识别、带权有限转态转换器、深度语音识别、时序分类、CTC解码
- 代码块练习题:看代码写程序的执行结果。
- java 时间轮算法_时间轮算法(TimingWheel)是如何实现的?
- 常用Git指令常用git命令清单
- Python 中的json字符串以及使用
- java泛型实例化_java基础-泛型举例详解
- Identify ksusetxn DID:An Deadlock ID
- 成功解决TypeError: a bytes-like object is required, not ‘str‘
- 转:互联网协议入门(一)
- 【MATLAB】(三)MATLAB在高等数学中的应用
- python重复import_Python 中循环 import 造成的问题如何解决?
- OSM和PBF数据格式说明
- 怎么安装java_怎么安装打印机到电脑步骤
- Linux一句话将文件夹的用户用户组设置为wps:wps
- 优秀架构师必须掌握的架构思维 - 菜鸟架构(转载)
- 东莞dell服务器维修怎么样,看看大牌戴尔服务器 r410的维修,是设计缺陷吗
- AMD显卡安装Caffe|深度学习|Ubuntu
- IoT黑板报0112:谷歌关闭Titan无人机上网项目
- 批量转换灰度图并保存
- c语言指针笔试面试题,c语言指针面试常见问题