JZOJ 1775. 合并果子2 (Standard IO)
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)相关推荐
- jzoj 3847. 都市环游(travel) (Standard IO)
Description 因为SJY干的奇怪事情过多,SJY收到了休假的通知,于是他准备在都市间来回旅游.SJY有一辆车子,一开始行驶性能为0,每过1时间行驶性能就会提升1点.每个城市的道路都有性能要求 ...
- [LUOGU] 1090 合并果子
题目描述在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- 合并果子(NOIP2004)
合并果子(NOIP2004) [问题描述] 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了 不同的堆.多多决定把所有的果子合成一堆.每一次合并,多多可以把两堆果子 合并到一起, ...
- SDUT 2127 树-堆结构练习——合并果子之哈夫曼树(优先队列)
树-堆结构练习--合并果子之哈夫曼树 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Problem Description ...
- sdut 2127 树-堆结构练习——合并果子之哈夫曼树 优先队列
Problem Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的 ...
- PAT甲级1125 Chain the Ropes:[C++题解]贪心、优先队列、合并果子
文章目录 题目分析 题目来源 题目分析 来源:acwing 板子题:合并果子合并果子优先队列 分析:贪心策略是: 每次取最短的两条绳子a和b.该两条绳子合并为1条绳子,且长度变为a+b2\frac{a ...
- 树-堆结构练习——合并果子之哈夫曼树
树-堆结构练习--合并果子之哈夫曼树 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆 ...
- 合并果子_tyvj1066_vijos1097_codevs1063_贪心+堆
描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看 ...
- SDNU 1171.合并果子(区间dp)
Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果 ...
最新文章
- Linux中的top命令查看内存和cpu信息
- Python应用实战-如何通过python对Excel进行常规性操作
- sublime配置python开发环境_win7 下搭建sublime的python开发环境的配置方法
- WRF-Chem User Guide3.9.1.1 部分内容翻译
- 计算机对团队合作的重要性,最新研究表明:计算机+协作完败面对面协作、计算机独立工作...
- wire routing 网格寻址
- 想活得开心,请放下这7样:烦恼、自卑、懒惰、消极、抱怨、犹豫、狭隘
- 从学习2021美赛O奖论文到获得2022美赛M奖——论文精读经验分享
- hive三种建表语句
- 声纹识别之Alize入门教程(三):I-vector
- D2 日报 2019年 03月 13日
- 宇宙APP简单的性能测试
- 手机摄像头变成PC电脑摄像头
- ARM32 寄存器分类
- 一键服务端是什么意思_一键消除马赛克和圣光?这类软件能否在未来成为二次元宅男的福音...
- nb_samples(采样数)转换
- 排序算法(冒泡排序)
- SAP中通过生产版本有效期控制物料生产入库分析测试
- lmageNet 数据集简介
- 10年期国债利率笔记