题目链接:http://poj.org/problem?id=3253

题意:给出n块木板的长度L1,L2...Ln,求在一块总长为这个木板和的大木板中如何切割出这n块木板花费最少,花费就是将木板切割前的长度。

有个陷阱就是需要用long long 去储存

Sample Input

3
8
5
8

Sample Output

34

就是将一块长为21的木板先切成13和8,花费21。然后将13切成5和8,花费13,总花费21 + 13 = 34。

分析:如果考虑从一块木板分割成小木板,方法数会有很多种,其实可以转化成从小木板合成大木板。

其实就是构造一棵最优二叉树(哈夫曼树),然后求出这棵树带权路径长度,过程如下:

题目可以转化为Huffman树构造问题 :

给定 N planks of woods,

1.   在 N planks 中每次找出两块长度最短的木板,然后把它们合并,加入到集合A中,

2.  在集合中找出两块长度最短的木板,合并加入到集合A中,重复过程,直到集合A中只剩下一个元素

显然,通过每次选取两块长度最短的木板,合并,最终必定可以合并出长度为 Sum(Li)的木板,并且可以保证总的耗费最少

所以采用优先队列,每次都取出两块最短的木板,然后结果加上这两块木板长度,再入队(这两块木板长度之和),直到木板之和为一块

#include<bits/stdc++.h>
const long long maxn = 2e4+;
using namespace std;
int main()
{
priority_queue<long long,vector<long long>, greater<long long> > q;
long long n;
scanf("%lld", &n);
if(n == )
{
long long l;
scanf("%lld", &l);
printf("%d\n", l);
return ;
}
if(n == )
{
long long l1, l2;
scanf("%lld %lld", &l1, &l2);
printf("%d\n",l1+l2);
return ;
}
while(n--)
{
long long t;
scanf("%lld", &t);
q.push(t);
}
long long res = ;
do
{
long long t1 = q.top();q.pop();
long long t2 = q.top();q.pop();
// printf("%d %d\n", t1, t2);
q.push(t1+t2);
res += t1+t2;
}while(q.size()!= );
printf("%lld\n",res);
return ;
}

最新文章

  1. ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)
  2. openssl 证书操作命令
  3. java mybatis 中sql 模糊查询
  4. 学习笔记-Kuaihu(仿知乎日报)
  5. Eclipse代码风格
  6. iOS-CALayer图片淡入淡出动画
  7. linux设置主机名
  8. Nginx启动SSL功能,并进行功能优化,你看这个就足够了
  9. 从一到二:利用mnist训练集生成的caffemodel对mnist测试集与自己手写的数字进行测试
  10. javaWeb实现使用邮箱邮件找回密码功能
  11. libc++abi.dylib handler threw exception
  12. iOS UILabel 使用姿势大全(标红关键字)
  13. Please verify you invoked Maven from the correct directory
  14. [置顶] Android开发之Thread类分析
  15. Python数据分析之路(一)查询和统计
  16. MySQL在字段中使用select子查询
  17. iOS应用程序工程文件以及启动流程
  18. 分布式系统监视zabbix讲解九之使用snmp监控windows--技术流ken
  19. 处理程序“SimpleHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler” 先装 .Net 后装 IIS
  20. day12作业答案

热门文章

  1. 手机端实现6位短信验证码input输入框效果(样式及代码方法)
  2. 利用动态扫描和定时器1在数码管上显示出从765432开始以1/10秒的速度往下递减 直至765398并保持此数,与此同时利用定时器0以500MS速度进行流水灯从上至下移动 ,当数码管上数减到停止时,实验板上流水灯出停止然后全部开始闪烁,3秒后(用 T0定时)流水灯全部关闭,数码管上显示出“HELLO”,到此保持住
  3. Zznu 1913: yifan and matrix (多路归并)
  4. ssrs 2016, mobile report error: The report may be misconfigured, the data may not be available, or the server version may be unsupported.
  5. Hibernate3中重复引用hbm文件错误信息记录
  6. TestNG基本注解(二)
  7. 455 Assign Cookies 分发饼干
  8. C. Two strings 二分 + 预处理
  9. 通过 DBCA 工具创建Oracle数据库
  10. js中,浏览器中不同元素位置属性解析