问题

Fate 有 n 个 ACM/ICPC 比赛的模板,每个都是一个独立的 PDF 文件。为了便于打印,万神希望将这些模板合并成一个 PDF 文件。万神有一个工具,可以将至多 k 个 PDF 文件合并为 1 个,合并后的文件大小是原来 k 个文件的大小之和。万神发现,这个工具每次运行的时间正比于输出文件的大小。设每输出 1KB 需要 1 单位时间,那么万神至少要多少时间才能合并完所有的文件呢?

输入格式

输入文件包含多组数据(最多 100 组),请处理到文件结束。
每组数据包含 2 行,第 1 行包含两个整数 n、k,用空格分割。
第二行包含 n 个整数 s1 · · · sn,用空格分割,表示原始的 n 个模板文件的大小(单位为 KB)。
保证 1 ≤ n ≤ 1000,2 ≤ k ≤ 1000,1 ≤ si ≤ 109。

输出格式

对于每组数据输出 1 行,表示合并所有文件需要的最短时间。

输入样例

7 4
1 2 3 4 5 6 7
3 5
1 2 3

输出样例

38
6

样例解释

对于第一组样例,首先合并前 4 个文件,耗费 10 单位时间。之后把生成的大小 10KB 的文件和后 3 个文件合并,耗费 28 单位时间,共计 38 单位时间。不存在时间更少的合并方案。
对于第二组样例,可以一次合并所有文件。

HINT

对于较大的数据,你可能需要使用 64 位整数。

代码

/*
problem:合并模板
task: 一次最多合并k个pdf花费代价为合并页数之和,求合并n个页数为si的pdf的最小代价。
tutorial: 对于每页,参与合并的次数越多,总代价越大,所以每次尽量合并k个最少页数的。
注意到如果每次合并k个后最后一次只需合并少于k个,那么,让第一次合并少于k个,这样可以花费更少代价将其合并为1个pdf。
可以每次都排一次序,不过维护两个单调队列也可以,只要排一次序。
s是未合并的,h是合并过的。
每次取min(min(s),min(h)),min(s)就是s.top,min(h)就是h.top。
合并好的插入h队列。每次合并时累加答案。
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 1005
#define ll long long
using namespace std;
int n,k,t,p;
ll s[N],h[N];
ll solve()
{
int top=p+,htop=;
printf("p=%d %d",p,h[]);
ll ans=p?h[]:;//加上第一次合并的代价,p==0即没有合并过,则h[0]==s[0],ans要=0,而不是h[0]。
for(int i=; i<=t; i++)//合并t次
{
for(int j=; j<k; j++)//合并k个
if(htop==i||s[top]<h[htop]&&top<n)//第i次合并如果前面i-1次合并的已经用过了,就不能再从h里面选了
h[i]+=s[top++];
else
h[i]+=h[htop++];
ans+=h[i];//累加答案
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&k))
{
memset(h,,sizeof h);
for(int i=; i<n; i++)
scanf("%lld",&s[i]);
sort(s,s+n);
t=(n-)/(k-);//每次最大合并减少k-1个pdf,全部合并需要减少n-1张,于是需要t次最大合并(t是向下取整的)
p=n--t*(k-);//还要一次合并是减少p(p<k-1)张的。
for(int i=; i<=p; i++)//合并最小的p+1张
h[]+=s[i];
printf("%lld\n",solve());
}
return ;
}

  

 

【XDU1144】合并模板的更多相关文章

  1. C# 创建邮件合并模板并合并文本、图片

    对于Word中的邮件合并功能,用户可以将邮件合并后的结果文档保存并打印,也可以通过邮件的形式发送,在很多场合需要使用到此功能.那对于编程人员,我们也可以在C#语言环境中通过代码的形式来实现.根据需要先 ...

  2. Java 在Word中创建邮件合并模板并合并文本和图片

    Word里面的邮件合并功能是一种可以快速批量操作同类型数据的方式,常见的如数据填充.打印等.其中必不可少的步骤包括用于填充的模板文档.填充的数据源以及实现邮件合并的功能.下面,通过Java程序展示如何 ...

  3. xdoj--1144 (合并模板)--有趣的优先队列(优先队列默认权值最大的数在前面)

    我觉得这道题出的很好 区别于“哈夫曼树” 因为事之多合并k个 理论说尽可能多合并. 然后我们看一个简单的例子 4 3 1 2 3 4  ——>6 4——>10 (6+10)=16: 1 2 ...

  4. 使用T4模板合并js文件

    不知道该怎么表达,或许直接贴图贴代码更好 前因:在第一个使用angularjs的项目中我将所有的controller写到一个文件里面,深知维护起来那滋味,所以再次使用angularjs的时候,我便把所 ...

  5. T4模板合并js

    使用T4模板合并js文件 不知道该怎么表达,或许直接贴图贴代码更好 前因:在第一个使用angularjs的项目中我将所有的controller写到一个文件里面,深知维护起来那滋味,所以再次使用angu ...

  6. 【转】NVelocity模板引擎初学总结

    转自:http://sunxitao88.blog.163.com/blog/static/68314439200861963326251/ 前不久,接触到.NET下的MVC-MonoRail,它推荐 ...

  7. Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易.一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则 ...

  8. Velocity模板引擎入门

    类似于PHP中的Smarty,Velocity是一个基于Java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代 ...

  9. art-template引擎模板

    art-template简介 artTemplate(后文简称aT)才是模板引擎,而TmodJS(后文简称TJ,曾用名atc)则是依赖于前者的一款模板预编译器.两者都是由腾讯开发.其实aT完全可以独立 ...

随机推荐

  1. 部署Zipkin分布式性能追踪日志系统的操作记录

    Zipkin是Twitter的一个开源项目,是一个致力于收集Twitter所有服务的监控数据的分布式跟踪系统,它提供了收集数据,和查询数据两大接口服务. 部署Zipkin环境的操作记录:部署Zipki ...

  2. WPF Extended WPF Toolkit

    1.VS 2013 通过NUGet获取Extended WPF Toolkit 我自己的项目已安装 2.在自己页面引用Extended WPF Toolkit xmlns:xctk="htt ...

  3. [转]hadoop hdfs常用命令

    FROM : http://www.2cto.com/database/201303/198460.html hadoop hdfs常用命令   hadoop常用命令:  hadoop fs  查看H ...

  4. c语言 动态数组

    C语言中,在声明数组时,必须明确告诉编译器数组的大小,之后编译器就会在内存中为该数组开辟固定大小的内存.有些时候,用户并不确定需要多大的内存,使用多大的数组,为了保险起见,有的用户采用定义一个大数组的 ...

  5. C#委托Action、Action<T>、Func<T>、Predicate<T>

    CLR环境中给我们内置了几个常用委托Action. Action<T>.Func<T>.Predicate<T>,一般我们要用到委托的时候,尽量不要自己再定义一 个 ...

  6. ThinkPHP项目CMS内容管理系统开发视频教程【20课】(3.02GB)

    ThinkPHP背景介绍:     ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业级应用开发而诞生的. ...

  7. Android -- Properties使用

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Properties; public ...

  8. TCP建立连接、断开连接以及正常报文的报头和报位的大小

    正常通信报文大小: 以太网的头尾:14字节 IP首部:20字节 TCP首部:20字节 尾部4字节校验 合计:58 三次握手的报文大小: SYN: 70 AYN,ACK:72 ACK: 64 合计:20 ...

  9. LeetCode-Group Shifted Strings

    Given a string, we can "shift" each of its letter to its successive letter, for example: & ...

  10. Linux(9.14-9.20)学习笔记

    实验一 Linux系统简介 一.Linux 为何物 Linux 就是一个操作系统,Linux 也就是系统调用和内核那两层. 二.Linux 历史简介 操作系统始于二十世纪 50 年代,当时的操作系统能 ...