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. c++实现mlp神经网络

    之前一直用theano训练样本,最近需要转成c或c++实现.在网上参考了一下其它代码,还是喜欢c++.但是看了几份cpp代码之后,发现都多少有些bug,很不爽.由于本人编码能力较弱,还花了不少时间改正 ...

  2. 161116、springmvc自己实现防止表单重复提交(基于注解)

    原理:在去某个页面直接生成一个随机数(这里使用的是UUID)并放入session中,用户提交表单时将这个随机数传入服务端与session中的值进行比较,如果不不存在或不相等,则认为是重复提交:如果相等 ...

  3. 正确配置Linux系统ulimit值的方法【转】

    转自:http://www.cnblogs.com/ibook360/archive/2012/05/11/2495405.html 在Linux下面部署应用的时候,有时候会遇上Socket/File ...

  4. 处理字符串中的换行,将textarea中的带有换行的字符串变为逗号分隔的写法

    _setMultipleInputValues: function (param) { //Maybe need to modify here for the new parameter //add ...

  5. libsqlite3.dylib找不到

    Xcode7中 Link Binary With Libraries 没有 .dylib库,只能找到对应的 .tbd,但不能代替使用,通过查找资料,尝试后得到以下两种解决方法. 方法1. (heqin ...

  6. easyui设置界面的高度自适应

    单独设置界面中特定region区时,高度自适应失败:设置整个界面时成功.实现代码在script块中,具体代码如下: <%@ Page Language="C#" AutoEv ...

  7. vi复制文字

    可以对文字使用标记,在光标处使用 ma 将该行标记为a,可用`a (反引号)定位到该标记a位置,用'a (单引号)定位到该行行首. d$删除光标位置到行尾,y$取光标位置到行尾.d和y也可配合标记使用 ...

  8. bianwu | 数据行 | 填写意见

    protected void gv1_RowDataBound(object sender, GridViewRowEventArgs e) { //首先判断是否是数据行 if (e.Row.RowT ...

  9. React.js入门小案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <title&g ...

  10. sql 2000以及2005以上获取数据库中所有的表(不包括系统表)

    ---------------------------------------------------------------------------- --sql 2005以上数据库 --- 获取数 ...