合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
描述
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
例如有3种果子,数目依次为1,2,9。可以先将1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
格式
输入格式
输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。
输出格式
输出包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。
限制
每个测试点1s
来源
NOIp 2004
思路:
算是简单吧?类似哈夫曼树,每次寻找最小的两堆合并
写了两个版本,一个是优先队列的很短,还有就是手打堆
第一次写这么长的c++心中略j动。掌握好了语法知识,算法的核心思想都是差不多的了
源程序/c++:
/*
作者:olahiuj
题目:p1063 合并果子
*/
#include <stdio.h>
#include <queue>
using namespace std;
priority_queue<int>heap;
int main()
{int n,x,ans=0;scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&x),heap.push(-x);int a,b;for (int i=1;i<n;i++){a=-heap.top();heap.pop();b=-heap.top();heap.pop();heap.push(-a-b);ans+=a+b;}printf("%d\n",ans);return 0;
}
#include <stdio.h>
using namespace std;
int t[10000]={0};
int maxT=0;
int ans=0;
void swap(int &x,int &y)
{int tmp=x;x=y;y=tmp;
}
void insert(int x)
{maxT++;int v=maxT;while (v>1&&t[v/2]>x){t[v]=t[v/2];v/=2;}t[v]=x;
}
void fy(int x)
{int p;int l=x*2;int r=x*2+1;if (l<=maxT&&t[l]<t[x]) p=l;else p=x;if (r<=maxT&&t[r]<t[p]) p=r;if (x!=p){swap(t[x],t[p]);fy(p);}
}
int pop()
{int g=t[1];t[1]=t[maxT];maxT--;fy(1);return g;
}
int main()
{int n,x;scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&x);insert(x);}while (maxT>1){int x=pop();int y=pop();insert(x+y);ans+=x+y;}printf("%d",ans);return 0;
}
转载于:https://www.cnblogs.com/olahiuj/p/5781287.html
合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆相关推荐
- 【codevs1063NOIP04PJ】合并果子,贪心の钻石
1063 合并果子 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果 ...
- luoguP1090 合并果子 (贪心+优先队列)
题目链接:https://www.luogu.org/problemnew/show/P1090 思路: 典型的贪心题,显然每次选择两个最小的堆合并最后耗费的体力最少,但每次合并之后都需要寻找最小的两 ...
- 合并果子(贪心,优先队列)
我们有 STL !!! STL里的优先队列 : priority_queue 定义: priority_queue<int>q; 从小到大: priority_queue<int,v ...
- PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子
文章目录 题目分析 题目来源 题目分析 来源:acwing 板子题:合并果子合并果子优先队列 分析:贪心策略是: 每次取最短的两条绳子a和b.该两条绳子合并为1条绳子,且长度变为a+b2\frac{a ...
- 贪心算法——洛谷(P1090)[NOIP2004]合并果子
该题目也属于经典的贪心算法,在这里熟悉C++里优先队列的使用. 需要导入头文件: #include<queue> 从这个问题可以深挖出神奇的哈夫曼树问题. 因为这题里合并的是二叉树,所 ...
- 每日四题打卡-4.15:耍杂技的牛/贪心绝对值不等式-货仓选址/贪心排序不等式-排队打水/huffman哈夫曼树-合并果子
耍杂技的牛 具体:https://blog.csdn.net/qq_27262727/article/details/105515507 农民约翰的N头奶牛(编号为1..N)计划逃跑并加入马戏团,为此 ...
- SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...
- sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列
Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...
- 树-堆结构练习——合并果子之哈夫曼树
树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...
最新文章
- mssql sqlserver 模拟for循环的写法
- 文献学习(part26)--Extended Comparisons of Best Subset Selection, Forward Stepwise Selection, and Lasso
- Jest 测试框架 beforeEach 的设计原理解析
- 继续聊WPF——动态数据模板
- 泽泽计算机科技,《计算机与信息技术》大学技能学习丛书.pdf
- vscode安卓html扩展,vscode扩展信息.html
- Atitit mysql 数据类型 5.7.9 目录 1.1. 数值类型	1 2. 字符串	2 3. 时间日期	2 4. 地理位置	2 5. 几何数据的存储,生成,分析,优化。 空间数据类型(存储)
- setuna截图怎么放大缩小_手机中的望远镜 华为P30pro是怎么做到50倍变焦?
- 读书笔记系列2:《More Effective C++》
- 天使投资,众筹与项目背书
- Topaz Plugins Bundle 2018 for Mac(PS插件滤镜特效包)
- 月薪过万的java程序员需要什么能力_什么样能力的Java程序员月薪过万
- 2021-04-30
- css之右上角带弧形的三角形标签文字45度倾斜显示
- Linux rescue
- oracle dbms_utility,dbms_utility的两个有用方法
- JS的报错处理(throw、try、catch)
- 【学习OpenCV4】OpenCV入门精讲(C++/Python双语教学)
- 计算机没有地址栏,打开我的电脑 没有地址栏 任务栏 标准按钮
- Facebook React完全解析
热门文章
- 【Linux】一步一步学Linux——free命令(80)
- 【Linux】一步一步学Linux——rev命令(57)
- 【C++】 C++标准模板库(六) Queue
- [Qt教程] 第43篇 进阶(三)对象树与拥有权
- 分布式理论、架构设计(自定义RPC)
- 从字节码层面分析==比较integer和int
- php两数相乘,php – 如何将数字相乘,直到达到一位数字并计算数字?
- 解决 iOS 12.4 Killed: 9 的问题
- 第五章 PX4-GPS解析
- HDU - 6625 three arrays (Trie+dfs)