1775. 合并果子2 (Standard IO)

Time Limits: 1000 ms Memory Limits: 65536 KB

Description

  在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把所有的果子合成一堆。
  每一次合并,多多可以把其中任意不超过k堆果子合并到一起,消耗的体力等于合并在一起的这些堆果子的重量之和。最终合并成为一堆果子。多多在合并果子时总共消耗的体力等于每次合并所耗体力之和。
  因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力。假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序方案,使多多耗费的体力最少,并输出这个最小的体力耗费值。
  例如有5堆果子,数目依次为3,2,1,4,5,每次合并最多3堆。可以先将1、2、3堆合并,新堆数目为6,耗费体力为6。接着,将新堆与剩下的两堆合并,又得到新的堆,数目为15,耗费体力为15。所以多多总共耗费体力=6+15=21。可以证明21为最小的体力耗费值。

Input

  输入包括两行,第一行是两个整数n和k(1<=n,k<=10000),表示果子的种类数和每次最多可以合并的堆数。第二行包含n个整数,用空格分隔,第i个整数ai(1<=ai<=20000)是第i种果子的数目。

Output

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

Sample Input

5 3
3 2 1 4 5

Sample Output

21

Data Constraint

Hint

【数据规模】
  对于30%的数据,保证有n<=1000:
  对于50%的数据,保证有n<=5000;
  对于全部的数据,保证有n<=10000。

题解

这是上一题(合并果子)的加强版,多了个k(证明多多聪明了一点)

大体解法与合并果子一致
但是由于k的存在,有可能不能刚好取完,而刚好取完是最佳的方式

于是有两种解决方法,假设多出了m个
要么在取一大堆之前取这m个
要么在取一大堆之后取这m个

显然,根据哈夫曼树,每个叶子节点计算的次数是它的深度
再来看这m个
假如先取这m个,那么这m个深度就多了1
假如后取这m个,那么整棵树深度都多了1
很明显,前者更优

代码

#include<iostream>
#include<cstdio>
#define INF 2147483647
#define N 30001
using namespace std;long dui[N*2+1],top;
void add(long x)
{   long now;dui[++top]=x;for(now=top;dui[now/2]>dui[now]&&now>1;now/=2)swap(dui[now],dui[now/2]);
}
long qu()
{   long ans=dui[1],now;bool t=false;dui[1]=INF;now=1;while(!t){t=true;if(now*2==top||dui[now*2]<dui[now*2+1]){if(dui[now]>dui[now*2]){swap(dui[now],dui[now*2]);now=now*2;t=false;}}else if(now*2+1<=top)if(dui[now]>dui[now*2+1]){swap(dui[now],dui[now*2+1]);now=now*2+1;t=false;}}return ans;
}int main()
{   long n,i,j,k,q,m;long ans=0;scanf("%ld%ld",&n,&k);for(i=1;i<=n;i++){scanf("%ld",&q);add(q);}m=n%(k-1);if(m==0)m=k-1;if(m>1){q=0;for(i=1;i<=m;i++)q+=qu();ans+=q;add(q);}while(dui[2]!=INF||dui[3]!=INF){q=0;for(i=1;i<=k&&dui[1]!=INF;i++)q+=qu();ans+=q;add(q);}printf("%ld\n",ans);return 0;
}

JZOJ 1775. 合并果子2 (Standard IO)相关推荐

  1. jzoj 3847. 都市环游(travel) (Standard IO)

    Description 因为SJY干的奇怪事情过多,SJY收到了休假的通知,于是他准备在都市间来回旅游.SJY有一辆车子,一开始行驶性能为0,每过1时间行驶性能就会提升1点.每个城市的道路都有性能要求 ...

  2. [LUOGU] 1090 合并果子

    题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  3. 合并果子(NOIP2004)

    合并果子(NOIP2004) [问题描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了 不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子 合并到一起, ...

  4. SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)

    树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...

  5. sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列

    Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...

  6. PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子

    文章目录 题目分析 题目来源 题目分析 来源:acwing 板子题:合并果子合并果子优先队列 分析:贪心策略是: 每次取最短的两条绳子a和b.该两条绳子合并为1条绳子,且长度变为a+b2\frac{a ...

  7. 树-堆结构练习——合并果子之哈夫曼树

    树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...

  8. 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆

    描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...

  9. SDNU 1171.合并果子(区间dp)

    Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.  每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果 ...

最新文章

  1. Linux中的top命令查看内存和cpu信息
  2. Python应用实战-如何通过python对Excel进行常规性操作
  3. sublime配置python开发环境_win7 下搭建sublime的python开发环境的配置方法
  4. WRF-Chem User Guide3.9.1.1 部分内容翻译
  5. 计算机对团队合作的重要性,最新研究表明:计算机+协作完败面对面协作、计算机独立工作...
  6. wire routing 网格寻址
  7. 想活得开心,请放下这7样:烦恼、自卑、懒惰、消极、抱怨、犹豫、狭隘
  8. 从学习2021美赛O奖论文到获得2022美赛M奖——论文精读经验分享
  9. hive三种建表语句
  10. 声纹识别之Alize入门教程(三):I-vector
  11. D2 日报 2019年 03月 13日
  12. 宇宙APP简单的性能测试
  13. 手机摄像头变成PC电脑摄像头
  14. ARM32 寄存器分类
  15. 一键服务端是什么意思_一键消除马赛克和圣光?这类软件能否在未来成为二次元宅男的福音...
  16. nb_samples(采样数)转换
  17. 排序算法(冒泡排序)
  18. SAP中通过生产版本有效期控制物料生产入库分析测试
  19. lmageNet 数据集简介
  20. 10年期国债利率笔记

热门文章

  1. 什么是绩优股、什么是垃圾股、蓝筹股、红筹股
  2. RTSP基础之EasyDarwin流媒体转发环境搭建
  3. socket 配置选项 理解 socket errorno 情况收集
  4. index.jsp模板(约束)
  5. 批量下载modis数据(下)
  6. 优秀网址导航国内篇(更新于20170408)
  7. Windows 10 之相关操作界面回到过去
  8. 小米应用商店上传APK包时提示签名不存在
  9. Linux服务器编程--升序链表定时器和时间轮定时器的比较
  10. 二叉树的前、中、后序遍历