1774. 合并果子 (Standard IO)

Time Limits: 1000 ms Memory Limits: 65536 KB

Description

  在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。

  每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。

  因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。

  例如有3种果子,数目依次为1,2,9。可以先将 1、2堆合并,新堆数目为3,耗费体力为3。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为12,耗费体力为 12。所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。

Input

  输入文件fruit.in包括两行,第一行是一个整数n(1 <= n <= 30000),表示果子的种类数。第二行包含n个整数,用空格分隔,第i个整数ai(1 <= ai <= 20000)是第i种果子的数目。

Output

  输出文件fruit.out包括一行,这一行只包含一个整数,也就是最小的体力耗费值。输入数据保证这个值小于2^31。

Sample Input

3

1 2 9

Sample Output

15

Data Constraint

Hint

【数据规模】

  对于30%的数据,保证有n <= 100;

  对于50%的数据,保证有n <= 5000;

  对于全部的数据,保证有n <= 30000。

题解

今天查了下专题发现我似乎不知道哈夫曼树是啥,还好有大佬们可以问,于是找了到入门题练练

作为一道哈夫曼树入门题,还是很水的

直接依照哈夫曼树的定义做

建一个小根堆维护剩下的果子的最小值

然后每次找最小的两堆合并,再加回堆里就行了

代码

  1. #include<iostream>
  2. #include<iostream>
  3. #include<cstdio>
  4. #define INF 2147483647
  5. #define N 30001
  6. using namespace std;
  7. long long dui[N*2+1],top;
  8. void add(long x)
  9. { long now;
  10. dui[++top]=x;
  11. for(now=top;dui[now/2]>dui[now]&&now>1;now/=2)
  12. swap(dui[now],dui[now/2]);
  13. }
  14. long qu()
  15. { long ans=dui[1],now;
  16. bool t=false;
  17. dui[1]=INF;
  18. now=1;
  19. while(!t){
  20. t=true;
  21. if(now*2==top||dui[now*2]<dui[now*2+1]){
  22. if(dui[now]>dui[now*2]){
  23. swap(dui[now],dui[now*2]);
  24. now=now*2;
  25. t=false;
  26. }
  27. }else if(now*2+1<=top)
  28. if(dui[now]>dui[now*2+1]){
  29. swap(dui[now],dui[now*2+1]);
  30. now=now*2+1;
  31. t=false;
  32. }
  33. }
  34. return ans;
  35. }
  36. int main()
  37. { long n,i,q;
  38. long long ans=0;
  39. scanf("%ld",&n);
  40. for(i=1;i<=n;i++){
  41. scanf("%ld",&q);
  42. add(q);
  43. }
  44. for(i=1;i<n;i++){
  45. q=qu()+qu();
  46. ans+=q;
  47. add(q);
  48. }
  49. printf("%lld\n",ans);
  50. return 0;
  51. }

JZOJ 1774. 合并果子 (Standard IO)的更多相关文章

  1. JZOJ 1775. 合并果子2 (Standard IO)

    1775. 合并果子2 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 在一个果园里,多多已经将所有的果子 ...

  2. JZOJ 1736. 扑克游戏 (Standard IO)

    1736. 扑克游戏 (Standard IO) Time Limits: 1000 ms Memory Limits: 128000 KB Description 有一棵无穷大的满二叉树,根为sta ...

  3. JZOJ 1776. 经济编码 (Standard IO)

    1776. 经济编码 (Standard IO) Time Limits: 1000 ms Memory Limits: 128000 KB Description 为降低资料储存的空间或增加资料传送 ...

  4. JZOJ 1349. 最大公约数 (Standard IO)

    1349. 最大公约数 (Standard IO) Time Limits: 1000 ms Memory Limits: 65536 KB Description 小菜的妹妹小诗就要读小学了!正所谓 ...

  5. JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)

    5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...

  6. JZOJ 2137. 【GDKOI2004】城市统计 (Standard IO)

    2137. [GDKOI2004]城市统计 (Standard IO) Time Limits: 1000 ms  Memory Limits: 128000 KB  Detailed Limits  ...

  7. JZOJ 5326. LCA 的统计 (Standard IO)

    5326. LCA 的统计 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description Input Output S ...

  8. JZOJ 5307. 【NOIP2017提高A组模拟8.18】偷窃 (Standard IO)

    5307. [NOIP2017提高A组模拟8.18]偷窃 (Standard IO) Time Limits: 1000 ms Memory Limits: 262144 KB Description ...

  9. JZOJ 5305. 【NOIP2017提高A组模拟8.18】C (Standard IO)

    5305. [NOIP2017提高A组模拟8.18]C (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Description ...

随机推荐

  1. 关于 SQLServer Express 2012 的连接字符串

    调试的时候,使用的是 LocalDB,SqlConnection 的连接字符串很简单 Data Source=(localdb)\ProjectsV12;Initial Catalog=master; ...

  2. Laravel5.4 队列简单配置与使用

    概述 什么是队列? 百度百科是这样说的 “队列”是在传输过程中保存数据的容器. 举几个生活中例子: * iphone手机新款发布,三里屯iphone进的新货.大家要排队买,不能说一大堆人一起冲进去,那 ...

  3. 吴裕雄--天生自然python学习笔记:python下载安装各种模块的whl文件网址

    python下载安装各种模块的whl文件网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml

  4. highcharts 设置柱子之间的距离 柱子宽度

    plotOption : { column : { // 设置每个柱自身的宽度 pointWidth : // x轴每个点只用一个柱,则这个属性设置的是相邻的两个点的柱之间的间距. // 如果x轴每个 ...

  5. 微软要冷落windows是天方夜谭还是势在必行

    自从90年代开始,微软就统治着PC桌面市场,真正意义上地改变了世界,在很长一段时间内,Windows就和阳光.空气.水.电能一样,成为生活必需品,无处不在,又让人感觉不到其存在,正因如此,微软的市值于 ...

  6. svn安装使用1(转载)

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  7. Python:扫描目录下的所有文件

    扫描目录下的所有文件并返回文件的绝对路径 def fileListFunc(filePathList): fileList = [] for filePath in filePathList: for ...

  8. Java IO: OutputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) OutputStream类是Java IO API中所有输出流的基类.子类包括Buffere ...

  9. npm相关说明

    https://my.oschina.net/dkvirus?tab=newest&catalogId=5669676 https://my.oschina.net/dkvirus/blog/ ...

  10. 吴裕雄--天生自然KITTEN编程:青蛙答题过河