Description

题目描述

ZB loves playing StarCraft and he likes Zerg most!

One day, when ZB was playing SC2, he came up with an idea:

He wants to change the queen's ability, the queen's new ability is to choose a worker at any time, and turn it into an egg, after K units of time, two workers will born from that egg. The ability is not consumed, which means you can use it any time without cooling down.

Now ZB wants to build N buildings, he has M workers initially, the i-th building costs t[i] units of time, and a worker will die after he builds a building. Now ZB wants to know the minimum time to build all N buildings.

ZB喜欢玩星际争霸并且他爱用虫族!

有一天,在ZB玩星际争霸2的时候,脑洞乍开:

他想改变女王的技能,女王的新技能可以在任何时候指定一只农民,使其变成一个虫卵,K个单位时间后,两只农民将被孵化出来。此技能没有消耗,意味着你不需要担心冷却时间。

ZB想建N个建筑,他有M个初始农民,第i个建筑需要t[i]个单位时间,并且农民在完成建筑后立即死亡。现在ZB想知道建完全部N个建筑的最短时间。

Input

输入

The first line contains an integer T, meaning the number of the cases. 1 <= T <= 50.

For each test case, the first line consists of three integers N, M and K. (1 <= N, M <= 100000, 1 <= K <= 100000).

The second line contains N integers t[1] ... t[N](1 <= t[i] <= 100000).

输入的首行是一个整数T,表示测试样例的数量。1 <= T <= 50。

对于每个测试样例,第一行有3个整数N,M和K。(1 <= N, M <= 100000, 1 <= K <= 100000)。

第二行有N个整数t[1] ... t[N](1 <= t[i] <= 100000)。

Output

输出

For each test case, output the answer of the question.

对于每个测试样例,输出问题的答案。

Sample Input - 输入样例

Sample Output - 输出样例

2

3 1 1

1 3 5

5 2 2

1 1 1 1 10

6

10

Hint

提示

For the first example, turn the first worker into an egg at time 0, at time 1 there’s two worker. And use one of them to build the third building, turn the other one into an egg, at time 2, you have 2 workers and a worker building the third building. Use two workers build the first and the second building, they are built at time 3, 5, 6 respectively.

对于第一个例子,在0时刻选择农民变虫卵,在1时刻有2个农民。然后用一个去建第三个建筑,另一个变成虫卵。

在2时刻,你有2个农民,并且第三个建筑正在建造。用两个农民分别建造第一和第二个建筑,他们会在时刻3,5,6分别完成。

【题解】

类似哈夫曼树的合并方式,对于当个农民(工蜂)来说,算上分裂技能,建造是不断两两并行的,建造时间越小,合并的价值就越小。合并后的时间去被合并两者的较大值+K。初始农民的数量就是合并的终点。

然后问题可以化成,给你一堆数字,每次把次小值+K,再删除当前最小值,直到剩下M个数字。

【代码 C++】

multiset会超时,还是用优先队列吧,默认排序的大根堆,改成小根堆就好了。

代码只是为了简洁与能过,想要理想的效率还是要经过进一步的优化。

 #include<cstdio>
#include<queue>
#include<functional>
std::priority_queue<int, std::vector<int>, std::greater<int> > data;
int main(){
int t, N, M, K, i, j;
scanf("%d", &t);
while (t--){
scanf("%d%d%d", &N, &M, &K);
for (i = ; i < N; ++i) scanf("%d", &j), data.push(j);
while (N > M){
data.pop();
data.push(data.top() + K);
data.pop();
--N;
}
while (data.size() != ) data.pop();
printf("%d\n", data.top());
data.pop();
}
return ;
}

FZU 2219

FZU 2219 StarCraft(星际争霸)的更多相关文章

  1. PySC2是DeepMind的“星际争霸II学习环境”(SC2LE)的Python组件

    PySC2是DeepMind的"星际争霸II学习环境"(SC2LE)的Python组件. 它暴露了暴雪娱乐公司的星际争霸II机器学习API作为Python RL环境. 这是Deep ...

  2. 2018年星际争霸AI挑战赛–三星与FB获冠亚军,中科院自动化所夺得季军

    雷锋网 AI 科技评论消息,2018 年 11 月 13-17 日,AAAI 人工智能与交互式数字娱乐大会 (AI for Interactive Digital Entertainment) 在阿尔 ...

  3. 星际争霸2 AI开发(持续更新)

    准备 我的环境是python3.6,sc2包0.11.1 机器学习包下载链接:pysc2 地图下载链接maps pysc2是DeepMind开发的星际争霸Ⅱ学习环境. 它是封装星际争霸Ⅱ机器学习API ...

  4. FaceBook 发布星际争霸最大 AI 数据集

    简介 我们刚发布了最大的星际争霸:Brood War 重播数据集,有 65646 个游戏.完整的数据集经过压缩之后有 365 GB,1535 million 帧,和 496 million 操作动作. ...

  5. 20. 星际争霸之php设计模式--适配器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  6. 19. 星际争霸之php设计模式--迭代器模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  7. 18. 星际争霸之php设计模式--观察者模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  8. 17. 星际争霸之php设计模式--职责链模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  9. 16. 星际争霸之php设计模式--组合模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

随机推荐

  1. HTTP错误汇总(404、302、200……)

    HTTP 400 - 请求无效HTTP 401.1 - 未授权:登录失败HTTP 401.2 - 未授权:服务器配置问题导致登录失败HTTP 401.3 - ACL 禁止访问资源HTTP 401.4 ...

  2. oracle sql语言模糊查询--通配符like的使用教程

    转自:http://www.cnblogs.com/tyler2000/archive/2011/04/28/oracleSql.html oracle在Where子句中,可以对datetime.ch ...

  3. Java简单数据类型转换

      1. Integer<---String   (1) Integer x = new Integer(Integer.parseInt(String)); 2. Integer<--- ...

  4. Hadoop Balance

    一.hadoop balance工具的用法: 启动balance: bin/start-balancer.sh -threshold 5 停止balance: bin/stop-balancer.sh ...

  5. Cacti Install

    一.Cacti简介 Cacti是通过snmpget来获取数据,使用RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂的参数.它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查 ...

  6. php如何支持实现多线程并发

    <?php if(function_exists('date_default_timezone_set')) { date_default_timezone_set('PRC'); } func ...

  7. 几个常见的Laravel报错及解决方法

    报错:「Can't swap PDO instance while within transaction」 transactions >= 1) {throw new RuntimeExcept ...

  8. NSDictionary to jsonString || 对象转json格式

    -(NSString*)DataTOjsonString:(id)object { NSString *jsonString = nil; NSError *error; NSData *jsonDa ...

  9. JavaScript navigator 对象(转)

    navigator -- navigator对象通常用于检测浏览器与操作系统的版本 navigator,中文"导航器" 引用网址:http://www.dreamdu.com/ja ...

  10. 怎么查看jar包版本

    jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个目录 ...