融合软泥怪 (优先队列)
1、题目:
【题目描述】 魔法少女小风一路斩(砍)妖(瓜)除(切)魔(菜),终于在一个洞穴内遇到了一 群强大的敌人——融合软泥怪!融合软泥怪是分裂软泥怪在 LV36 时持有大师球发动魔法卡 [融合]进化产生的,他们有着神奇的特性:一定范围之内,当两个融合软泥怪被杀死的时候, 这两个融合软泥怪的尸体将会融合,重新生成一个攻击力为死掉的两个软泥怪尸体之和的新 软泥怪,也就是说,只有当这个软泥怪群只剩下一只融合软泥怪的时候,才会完全消灭,然 而,这最后一只融合软泥怪的攻击力也会灰常灰常高的。 由于经济比较紧张(说白了就是穷),小风买不起魔法药水,所以为了节约魔法值, 只能用斧头跟软泥怪对砍(夭寿啦!法师拿血吼砍人啦!),最后再用大招[奇迹的现世]秒 掉最后的那一只融合软泥怪。他每砍死一只软泥怪,就会失去与软泥怪攻击力相等的血量。 由于小风强!无敌!所以他的血量非常非常高,肯定能打死这群软泥怪,但是由于经济十分 紧张,他连治疗药膏都买不起,所以他想问一下睿智的你,打死这群融合软泥怪最少需要消 耗多少的生命值。
PS:总觉得好像走错了好多片场的样子。。。。。。
【输入格式】 第一行给出融合软泥怪的数量 N,保证 N 不超过 20000。
第二行 N 个整数,表示每个融合软泥怪的攻击力,保证每只软泥怪的攻击力不超过 50000
【输出格式】 输出一个整数 K,表示魔法少女小风杀完这群融合软泥怪最少需要消耗的生命值,保证 K 在 INT 范围内。
【样例输入】
3
8 5 8
【样例输出】
34
【样例解释】
战报:
小风杀死了攻击力为 5 的软泥怪,生命值-5
小风杀死了攻击力为 8 的软泥怪,生命值-8
软泥怪发动了特殊能力,一只攻击力为 13 的软泥怪被召唤
小风杀死了攻击力为 8 的软泥怪,生命值-8
小风杀死了攻击力为 13 的软泥怪,生命值-13
软泥怪发动了特殊能力,一只攻击力为 21 的软泥怪被召唤
小风发动了终结技[奇迹的现世],攻击力为 21 的软泥怪被消灭,魔力值-707063423
小风获得了战斗的胜利,失去了生命值 34 点,获得了节操值 3 点
做这道题之前先了解一下优先队列的用法戳这里了解
2、代码及解题思路
这道题的思路无非就是将输入的数从大到小入队,这时队列top出来的就是最小值,将最后的两个值融合之后再push进队列,重复之前的动作,直到只剩最后一个时,发动终结技,结束。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
//保证在队列里top出的那个是最小值
struct cmp
{
bool operator()(int x,int y)
{
return x>y;
}
};
int main()
{
int n;
scanf("%d",&n);
priority_queue<int,vector<int>,cmp>q;
int i;
for(i=0; i<n; i++)
{
int num;
scanf("%d",&num);
q.push(num);
}
int result=0;
while(q.size()>1)//当只剩一个的时候,发动终结技[奇迹的现世],不再进入循环
{
int a,b,sum=0;
a=q.top();
q.pop();
b=q.top();
q.pop();
sum=a+b;
q.push(sum);//重新融合的再次进入队列
result+=sum;
}
printf("%d\n",result);
return 0;
}