融合软泥怪 (优先队列)

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;
}
posted @ 2016-11-21 21:25  laixl  阅读(810)  评论(0编辑  收藏  举报