Boxes And Balls(三叉哈夫曼编码)
2024-08-30 04:36:09
题目
原题链接:http://codeforces.com/problemset/problem/884/D
现有一堆小石子,要求按要求的数目分成N堆,分别为a1、a2、...an。具体的,每次选一个堆(其重量为代价),分成2或3堆。求最小的可能代价。
思路
我们反向考虑,就是一个不断合并的过程。当n为奇数,我们总能找到三个最小的合并,直到只剩一堆;当n为偶数,先选择最小的两个合并,再按奇数一样处理。(为了统一起来,添加一个辅助堆,石子个数为0)
代码实现
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std; typedef long long ll;
int n; int main()
{
while (scanf("%d",&n) == )
{
priority_queue<ll,vector<ll>,greater<ll> >q;
ll ans = ;
for (int i = ; i < n; i++)
{
int tmp;
scanf("%d", &tmp);
q.push(tmp);
}
if ((n & ) == ) q.push(); //n为偶数,补充一个0
while (q.size() > )
{
ll a = q.top(); q.pop();
ll b = q.top(); q.pop();
ll c = q.top(); q.pop();
ans += (a + b + c);
q.push(a + b + c);
}
q.pop();
printf("%I64d\n", ans);
}
}
参考链接:
http://codeforces.com/blog/entry/55470
http://www.cplusplus.com/reference/queue/priority_queue/
最新文章
- linux 环境变量
- View和ViewImage设置图片
- imx6 MFG TOOL 分析
- BZOJ 2584: [Wc2012]memory(扫描线+线段树)
- 搜索(四分树):BZOJ 4513 [SDOI2016 Round1] 储能表
- Light OJ 1067 Combinations (乘法逆元)
- Spring——自定义属性编辑器+Bean的生存范围+Bean的生命周期
- 14.1.1 InnoDB as the Default MySQL Storage Engine
- MyBatis 配置的一些小知识点
- IDL 结构体
- Java反射之修改常量值
- Android应用程序国际化
- 学习笔记(一)HTML基础
- HTML5标签选择,图文混排使用dl dt dd
- 流媒体技术学习笔记之(十八)互联网草案HTTP直播流2017年5月
- elf逆向入门
- Kubernetes持久化存储1——示例
- react项目的ant-design-mobile的使用
- windows 8,关闭随意窗体都提示“已停止工作”的解决的方法
- Android系统执行Java jar程序 -- dalvik运行dex Java工程