基础实验4-2.7 修理牧场 (25分)

农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i​​个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是L​i​​的总和。
但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为20的木头锯成长度为8、7和5的三段,第一次锯木头花费20,将木头锯成12和8;第二次锯木头花费12,将长度为12的木头锯成7和5,总花费为32。如果第一次将木头锯成15和5,则第二次锯木头花费15,总花费为35(大于32)。
请编写程序帮助农夫计算将木头锯成N块的最少花费。

输入格式:
输入首先给出正整数N(≤10^​4​​),表示要将木头锯成N块。第二行给出N个正整数(≤50),表示每段木块的长度。

输出格式:
输出一个整数,即将木头锯成N块的最少花费。

输入样例:

8
4 5 1 2 1 3 1 1

输出样例:

49

我用的方法是:先用输入数据点构造哈夫曼树,再前序遍历所有非叶子结点,求所有非叶结点的数据之和。
该过程需要构造一个最小堆,最小堆内存的是中间过程产生的二叉树根结点地址,当最小堆内只剩下一个二叉树时,该二叉树就是哈夫曼树。
下面举例说明:
4 5 1 2 1 3 1 1
每个数据变成只有1个根结点的二叉树,逐个插入最小堆,形成:
1 1 1 1 2 4 3 5(从数组下标为1的开始存起)
每次找出序列中最小和次小的两个数,构成二叉树,其根结点是两个数之和,并将形成的二叉树插回最小堆:

将哈夫曼树中的所有非叶结点的值相加18+8+10+4+5+2+2=49
C语言实现:

#include<stdio.h>
#include<stdlib.h>
struct node
{int data;struct node * left;struct node * right;
};
typedef struct node * Bintree;
struct heap
{Bintree * d;int size;
};
typedef struct heap * Heap;
Heap Insert(Heap H, Bintree B);//向最小堆内插入元素
Bintree Delete(Heap H);//删除最小堆内最小的元素
Bintree Create(Heap H);//创建哈夫曼树的函数
void Sum(Bintree B);//求最少花费的函数
int sum = 0;//记录结果
int main()
{int n;scanf("%d", &n);int i;Bintree B;Heap H;H = (Heap)malloc(sizeof(struct heap));H->d = (Bintree *)malloc((n+1) * sizeof(Bintree));for (i = 0; i <= n; i++){H->d[i] = (Bintree)malloc(sizeof(struct node));}H->d[0]->data = -100;//岗哨H->d[0]->left = H->d[0]->right = NULL;H->size = 0;for (i = 1; i <= n; i++){B = (Bintree)malloc(sizeof(struct node));scanf("%d", &B->data);B->left = B->right = NULL;H = Insert(H, B);}Bintree HF;HF = Create(H);Sum(HF);printf("%d", sum);return 0;
}
//向最小堆内插入元素
Heap Insert(Heap H, Bintree B)
{int i = ++H->size;while (B->data < H->d[i / 2]->data){H->d[i] = H->d[i / 2];i = i / 2;}H->d[i] = B;return H;
}
//删除最小堆内最小的元素
Bintree Delete(Heap H)
{Bintree B;B = H->d[1];int i = H->size;int j = 2;while (j<i){if (H->d[j]->data > H->d[j + 1]->data){j = j + 1;}if (H->d[j]->data < H->d[i]->data){H->d[j / 2] = H->d[j];}else { break; }j = 2 * j;}H->d[j/2] = H->d[i];H->size--;return B;
}
//创建哈夫曼树的函数
Bintree Create(Heap H)
{Bintree p1, p2,p;while (H->size != 1)//直至最小堆内仅剩一个元素,该元素内存的是哈夫曼树的根结点地址{p = (Bintree)malloc(sizeof(struct node));p1 = Delete(H);p2 = Delete(H);p->data = p1->data + p2->data;p->left = p1;p->right = p2;H = Insert(H, p);}return H->d[H->size];
}
//求最少花费的函数
//前序遍历,将所有非叶结点的data值求和,即为所求值
void Sum(Bintree B)
{if (B != NULL){if (B->left != NULL && B->right != NULL) { sum = sum + B->data; }Sum(B->left);Sum(B->right);}
}

数据结构PTA习题:基础实验4-2.7 修理牧场 (25分)相关推荐

  1. 【两种方法】基础实验4-2.7 修理牧场 (25 分)

    立志用最少的代码做最高效的表达 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li的总和. 但 ...

  2. 【两种解法】基础实验4-2.2 列出叶结点 (25 分)

    立志用最少的代码做最高效的表达 对于给定的二叉树,本题要求你按从上到下.从左到右的顺序输出其所有叶节点. 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数.树中的结点从 0 到 N− ...

  3. 【视频讲解】基础实验4-2.1 树的同构 (25 分)

    立志用最少的代码做最高效的表达 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树 ...

  4. 基础实验 7-2.1 魔法优惠券(25 分)

    在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值 K,表示若你在购买某商品时使用这张优惠劵,可以得到K倍该商品价值的回报!该商店还免费赠送一些有价值的商品,但是如果你在领取免费赠品的 ...

  5. 7-29 修理牧场 (25分)(PTA实验题)

    7-29 修理牧场 (25分) 农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li ​​ 个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li ​​ ...

  6. python 7-33 修理牧场 (25 分) PTA

    农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数Li​个长度单位,于是他购买了一条很长的.能锯成N块的木头,即该木头的长度是Li​的总和. 但是农夫自己没有锯子,请人锯木的 ...

  7. 数据结构PTA习题:基础实验7-2.3 德才论 (25分)——排序

    基础实验7-2.3 德才论 (25分) 宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜 ...

  8. 数据结构PTA习题:进阶实验5-3.2 新浪微博热门话题 (30分)

    进阶实验5-3.2 新浪微博热门话题 (30分) 新浪微博可以在发言中嵌入"话题",即将发言中的话题文字写在一对"#"之间,就可以生成话题链接,点击链接可以看到 ...

  9. mooc浙大数据结构PTA习题之一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...

最新文章

  1. Java中Map用法详解
  2. 软考考后常见问题汇总
  3. WORD文档中的表格:自定义方式的批处理,增删行列和内容
  4. SAP Spartacus键盘按下tab键之后,出现的focus state border是如何实现的
  5. linux强行卸载qt,Linux下卸载QT SDK
  6. Android 自定义属性(attrs.xml,TypedArray)
  7. bootstrap-干货小结
  8. 基于深度卷积神经网络的玉米病害识别
  9. 数据结构—快速排序及其实现思想分而治之DC(思维导图版)
  10. labview 控件安装步骤
  11. ITIL4服务管理的新思路与实践案例介绍
  12. vue-router仿天猫底部导航栏
  13. React全家桶详细讲解-图文并茂
  14. 光伏电站清扫机器人_光伏电站清扫机器人
  15. 给idea设置注释(超便捷)
  16. 智能驾驶看湘江:中国智能网联汽车产业的“长沙样本”
  17. 【台大郭彦甫】Matlab入门教程超详细学习笔记五:初阶绘图(附PPT链接)
  18. C语言怎么消除最后的回车键,多样例输出,如何去掉最后一个回车
  19. 下级对上级回复已阅知_阅示、阅知、阅悉之间有什么区别
  20. 时空大数据与智慧城市

热门文章

  1. windows无法连接到打印机?三个方法连接打印机(Win10系统)
  2. 微软、谷歌、百度等公司经典面试100题
  3. Quartus编译错误:which fans out to accumulate:inst4|acc[12] cannot be assigned more than one value
  4. 掘金和CSDN的思考
  5. J2ME移动开发平台搭建
  6. 如何制作商场超市地摊清仓大甩卖广告语录音
  7. 最终幻想之父——坂口博信 (转载自天幻网(www.SquareCN.com))
  8. android 奥利奥功能,一加5/5T吃上Android 8.0奥利奥 这些新功能特性你不可不知
  9. Vim统计中文字数和英文单词数(附针对LaTeX的特殊处理)
  10. 3-2-1法建立零件坐标系