poj 3253 Fence Repair 贪心 最小堆 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=3253
题解
本题是<挑战程序设计>一书的例题
根据树中描述 所有切割的代价 可以形成一颗二叉树
而最后的代价总和是与子节点和深度相关的 由于切割的次数是确定的 该二叉树的节点就是确定的。
也就是说我们可以贪心的处理 最小长度的子节点放在最下面
如图
ac代码如下 使用了堆 记录每次最小的元素
堆的使用真的不是很方便 , 另外还需要注意 爆int 所以需要使用long long 记录元素的和

1 #include <iostream> 2 #include <algorithm> 3 #include <vector> 4 #include <assert.h> 5 6 7 8 using namespace std; 9 10 /* 11 poj 3253 12 有一个农夫要把一个木板钜成几块给定长度的小木板,每次锯都要收取一定费用,这个费用就是当前锯的这个木版的长度 13 给定各个要求的小木板的长度,及小木板的个数n,求最小费用 14 提示: 15 以 16 3 17 8 8 5为例: 18 19 先从无限长的木板上锯下长度为 21 的木板,花费 21 20 再从长度为21的木板上锯下长度为5的木板,花费5 21 再从长度为16的木板上锯下长度为8的木板,花费8 22 总花费 = 21 + 5 + 8 = 34 23 */ 24 25 26 int main() 27 { 28 int n; long long ret = 0; 29 cin >> n; 30 vector<int> wood(n); 31 for (int i = 0; i < n; i++) { 32 cin >> wood[i]; 33 } 34 make_heap(wood.begin(), wood.end(), greater<int>()); 35 36 while (wood.size() != 1) { 37 38 pop_heap(wood.begin(), wood.end(), greater<int>()); 39 long long total = wood.back(); 40 wood.pop_back(); 41 42 pop_heap(wood.begin(), wood.end(), greater<int>()); 43 total += wood.back(); 44 wood.pop_back(); 45 46 ret += total; 47 wood.push_back(total); 48 push_heap(wood.begin(), wood.end(), greater<int>()); 49 } 50 51 cout << ret << endl; 52 53 return 0; 54 }

1 #include <iostream> 2 #include <queue> 3 4 #include <stdio.h> 5 6 7 using namespace std; 8 9 typedef long long LL; 10 11 const int MAX_N = 100010; 12 int n, L[MAX_N]; 13 14 void solve() 15 { 16 LL ans = 0; 17 priority_queue<int, vector<int>, greater<int>> que; 18 for (int i = 0; i < n; i++) { 19 que.push(L[i]); 20 } 21 22 while (que.size() > 1) { 23 int l1, l2; 24 l1 = que.top(); 25 que.pop(); 26 l2 = que.top(); 27 que.pop(); 28 29 ans += l1 + l2; 30 que.push(l1 + l2); 31 } 32 printf("%lld\n", ans); 33 } 34 35 36 int main() 37 { 38 scanf("%d", &n); 39 40 for (int i = 0; i < n; i++) { 41 scanf("%d", &L[i]); 42 } 43 44 solve(); 45 }
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话