立志用最少的代码做最高效的表达


农夫要修理牧场的一段栅栏,他测量了栅栏,发现需要N块木头,每块木头长度为整数L​i个长度单位,于是他购买了一条很长的、能锯成N块的木头,即该木头的长度是Li的总和。

但是农夫自己没有锯子,请人锯木的酬金跟这段木头的长度成正比。为简单起见,不妨就设酬金等于所锯木头的长度。例如,要将长度为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


逆向思考:假设已经有N个锯开的木块,粘合两块的花费是合并后的长度,要如何粘合才能使花费最小? 这个问题与原问题是等价的, 很容易看出这就是构建哈夫曼树的过程。

实现要点:算法需要从一个集合中反复取最小值,同时不断将两个最小值相加新产生的数据放进集合,于是最小堆称为最合适的工具。

当然也可以使用封装好的“最小堆”,也就是优先队列。

下面分别给出最小堆优先队列的实现方法


优先队列解法

#include<queue>
#include<iostream>
#include<cstdio>
using namespace std;
int main() {int n; cin >> n;priority_queue<int, vector<int>, greater<int> >q;for(int i = 0; i < n; i++) {int x; cin >> x; q.push(x);}int n1 = n-1;long long sum = 0;while(n1--) {int x1 = q.top(); q.pop();int x2 = q.top(); q.pop();sum += x1+x2;q.push(x1+x2);}cout << sum << '\n';return 0;
}

最小堆解法

#include<iostream>
#include<cstdio>using namespace std;
const int Mindata = 0;
const int Maxdata = 500000;
const int Scale = 10000;typedef struct node* Heap;
int ans = 0;
struct node{int* Data;int size;int capacity;    //直接定义为无限大
}; Heap creatminheap(int maxsize) {Heap H = new node();H->Data = (int*)malloc(2*(maxsize+1) * sizeof(int)); //???H->size = 0;H->Data[0] = Mindata; return H;
}Heap insert(Heap H, int x) {int mom;for(mom=++H->size; x < H->Data[mom/2]; mom /= 2)H->Data[mom] = H->Data[mom/2];H->Data[mom] = x;return H;
}int DeleteMin(Heap H) {int Parent, Child;int MinItem, X;MinItem = H->Data[1];      //删除的是最小的节点 H->Data[1] = H->Data[H->size--];      //x等于小根堆最后一个节点(最大的节点)for(Parent = 1; Parent*2 <= H->size; Parent = Child) {Child = Parent*2;if((Child != H->size) && (H->Data[Child] > H->Data[Child + 1]))Child++;     //Child指向左右子节点的较小者if(H->Data[Parent] < H->Data[Child])     //剪枝 break;else swap(H->Data[Parent], H->Data[Child]);}return MinItem;
}int main() {int n, tmp;cin >> n;Heap H = creatminheap(n);for(int i = 0; i < n; i++) {cin >> tmp;H = insert(H, tmp);}n--; while(n--) {  //砍n-1次 tmp = DeleteMin(H) + DeleteMin(H);ans += tmp;H = insert(H, tmp); }cout << ans;
}


      ——你的潜意识,正在操控你的人生,而你却称之为命运。

【两种方法】基础实验4-2.7 修理牧场 (25 分)相关推荐

  1. 数据结构PTA习题:基础实验4-2.7 修理牧场 (25分)

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

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

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

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

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

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

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

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

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

  6. Java1.使用二分搜索算法查找任意N个有序数列中的指定元素。 2.通过上机实验进行算法实现。 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告。 4.至少使用两种方法进行编程,直接查

    1.使用二分搜索算法查找任意N个有序数列中的指定元素. 2.通过上机实验进行算法实现. 3.保存和打印出程序的运行结果,并结合程序进行分析,上交实验报告. 4.至少使用两种方法进行编程,直接查找/递归 ...

  7. 【mybatis基础】mybatis开发dao两种方法

    mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目.mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.mybat ...

  8. python基础入门:实现(无重复字符)字符串的全排列的两种方法

    求任意一个字符串的全排列组合,例如a='123',输出 123,132,213,231,312,321.(暂时假定字符串没有重复) 目前有两种解决的方法 方法一: def str_sort(s='') ...

  9. POJ 4151/北大百练 4151 电影节 题解(两种方法)贪心算法基础

    POJ4151 电影节 总时间限制: 1000ms 内存限制: 65536kB 描述: 大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看( ...

最新文章

  1. 闽台“物联网+”产业融合方兴未艾
  2. 办公室自动化系统_大队举办办公自动化系统培训班
  3. springboot之jackson的两种配置方式
  4. window查看端口号使用_踩坑搭建vue说端口号被占用?
  5. 写一个饿汉单例模式的例子_你写的单例模式,能防止反序列化和反射吗?
  6. C/C++中手动获取调用堆栈【转】
  7. 任务管理器启动资源管理器
  8. C语言-输入一个正整数,输出它的所有质数因子
  9. butterknife 配置了点击和绑定无效
  10. location匹配
  11. params.c:Parameter() - Ignoring badly formed line in configuration file: ignore errors 解决方法
  12. Jupyter Notebook设置黑色背景主题,字体大小,代码自动补全
  13. 操作系统-程序执行时间分析
  14. android实现开机自动运行程序,Android编程实现应用程序开机自启动的方法
  15. 从Hadoop到Spark和Flink,大数据处理框架十年激荡发展史
  16. 赵小楼《天道》《遥远的救世主》深度解析(93)究竟真理真Xiang的踪迹
  17. Cision与Brandwatch达成收购协议,整合公关、社交媒体管理和数字消费者洞察
  18. 微信小程序快速接口编写
  19. linux待机唤醒_Linux电源管理-休眠与唤醒
  20. Fast Global Registration(快速全局配准)

热门文章

  1. UDT协议实现分析——UDT Socket的创建
  2. Netty HTTP on Android
  3. MySQL(四)复合查询与联合查询
  4. C++ 泛型编程(一):模板基础:函数模板,类模板,模板原理,模板匹配规则
  5. docker学习笔记(七)docker-swarm
  6. 基于LZ77算法的文件压缩
  7. SRS的2021,盐碱地里种西瓜的王婆
  8. 张睿:OpenH264拥有产品级的鲁棒性 欢迎contribute
  9. 微信小程序开放直播能力,你怎么看?
  10. 当你不知道发什么表情包的时候...