217. 栅栏修理 Fence Repair(挑战程序设计竞赛)
地址 https://www.papamelon.com/problem/217
我们的目标是将一块完整的木板切割成 n 块,每块长度为 L1,L2,L3...Ln 。
切割后各个木块的长度总和与切割前的木板长度相等。
每次在一块木板上切一刀,代价等于该木板的长度。例如:
在长度为 21 的木板切一刀,变成两块木板,长度分别为 5,16,所需代价为 21
在长度为 16 的木板上再切一刀,变为两块木板,长度分别为8,8,所需代价为 16
为了达到上述目标,求最小的切割代价是多少。
输入
第一行是整数
n(1≤n≤20000),表示要将原始木板切割成多少块
接下来 n 行,每行一个整数,表示最终每块小木板的长度,其中
1≤Li≤50000
输出
一行,一个整数,表示达到目标所需的最小代价
提示
2021/12/07 测试数据更新,以往通过代码不会重判,可尝试重新提交
样例 1
输入
3
8
5
8
输出
34
根据题意分析 可以理解为各个木块碎片最后拼成一块,每次拼装的代价就是拼装的长度
我们使用优先队列进行各个木块的长度存储(两个木块合并后要弹出两个木块的长度并且加入合并后的木块长度,重新排序)
根据li的数据范围计算(20000X50000) 我们需要开longlong 变量
代码如下
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
priority_queue<long long, vector<long long>, greater<long long>> q;
int n;
int main(){
cin >>n;
for(int i = 0;i < n;i++){
int t ;cin >>t;
q.push(t);
}
long long ans = 0;
while(q.size() > 1){
int a= q.top();q.pop();
int b = q.top();q.pop();
ans += a+b;
q.push(a+b);
}
cout<<ans<<endl;
return 0;
}
作 者: 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 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
2021-01-31 剑指 Offer 47. 礼物的最大价值 dp