博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 10954 - Add All
阅读量:6406 次
发布时间:2019-06-23

本文共 1407 字,大约阅读时间需要 4 分钟。

题意:

输入一串数据,拿出两个相加,把和放回去,再拿出两个相加,把和放回去……依次循环,最后找出最小的和。

思路:

使用优先队列+贪心,队列按从小到大排列,每次选出队首最小的2个数据,计算之后把和再放回队列。也就是哈夫曼编码算法。

Using a Priority Queue, you can greedily take the two smallest numbers, add them and insert them back into the Priority Queue. 1 #include <iostream>

#include 
#include
#include
#include
#include
using namespace std;class T{ public : int n;};bool operator < (const T &t1, const T &t2){ return t1.n > t2.n;}class AddAll{ private: priority_queue
pri_que; int sum; public: void init(); void process();// void output();};void AddAll::init(){ while(!pri_que.empty())pri_que.pop(); sum = 0;}void AddAll::process(){ int num; T temp; while(cin>>num){ if (num == 0)break; init(); while(num--){ cin>>temp.n; pri_que.push(temp); } while(!pri_que.empty()){ T top1 ,top2 ,sumTop; top1 = pri_que.top(); pri_que.pop(); if(!pri_que.empty()){ top2 = pri_que.top(); pri_que.pop(); } else top2.n = 0; sumTop.n = top1.n + top2.n; sum = sumTop.n + sum; if(!pri_que.empty()) pri_que.push(sumTop); } cout<
<

 

注意:要重载'<',使优先队列从小到大排列。

 

测试数据:

数据来源:http://www.algorithmist.com/index.php?title=UVa_10954

 

Input

31 2 341 2 3 410100000 100000 100000 100000 100000 100000 100000 100000 100000 100000 52 2 2 2 30

 

 

 

 

 

 

 

Output 

919340000026

转载于:https://www.cnblogs.com/ohxiaobai/p/4487841.html

你可能感兴趣的文章
地图绘制初探——基于maptalks的2.5D地图绘制
查看>>
SpringBoot2.0之七 实现页面和后台代码的热部署
查看>>
Git 仓库大扫除
查看>>
设计模式-单例模式
查看>>
es6基础0x014:WeakMap
查看>>
九种 “姿势” 让你彻底解决跨域问题
查看>>
php中mysqli 处理查询结果集总结
查看>>
你不知道的JavaScript运算符
查看>>
小程序开发注意事项
查看>>
ECMAScript7规范中的instanceof操作符
查看>>
Hadoop HDFS原理分析
查看>>
【webpack4】基本配置和入门api
查看>>
Mac使用ssh公钥登录Linux
查看>>
【366天】跃迁之路——程序员高效学习方法论探索系列(实验阶段124-2018.02.06)...
查看>>
POJ3070-Fibonacci(矩阵快速幂)
查看>>
[vue插件]基于vue2.x的电商图片放大镜插件
查看>>
标准的组件结构
查看>>
vue——一个页面实现音乐播放器
查看>>
SVG 扬帆起航
查看>>
NET Core-学习笔记(二)
查看>>