NO GAME NO LIFE(优先队列/最小堆)

版权声明:转载请标明出处哦 https://blog.csdn.net/PleasantlY1/article/details/82190816

题目描述

输了不感到悔恨的人,没资格当游戏玩家,不过正因为如此,才会第一次觉得快乐  

在网络上成为都市传说的天才玩家兄妹·空和白实际是家里蹲尼特族。他们将将世界称为“垃圾游戏”。某天,这两个人某一天被自称“神”的少年召唤到了异世界。那是被神明禁止了战争,一切交由游戏来决定"的世界——没错,就连国境线也是一样。被其他种族逼入绝境,只剩下最后一座都市的“人类种”。空和白,两名废人兄妹到底能否在异世界成为“人类的救世主”?——那么,让我们开始游戏吧,

  空白两人遇到了这样一个游戏,一款类似2048的游戏规则如下

一开始,有 n 个方块,每个方块上有一个 1 到 m 的整数。空白可以进行两种操作:

1、 选择两个数字相同的方块(不一定要相邻),将它们合并成一个数字为原来的两倍的方块;

2、 减小一个方块上的数字。

操作的次数没有限制,最终的得分为所有方块上的最大的数字。因为空白玩游戏没有输过,所以请你想办法来解决掉这个问题!

输入

第一行 两个数n代表n个方块  m代表方块上的数字 m n<=1e5

第二行 n个数

输出

一个数表示最大值

样例输入

5 10
6 10 7 5 4

样例输出

24

思路:每次找最小的2个进行合并,取较小值翻倍进队。注意用longlong,int会炸

代码如下:

#include<set>
#include<map>
#include<list>
#include<deque>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<stdio.h>
#include<sstream>
#include<stdlib.h>
#include<string.h>
//#include<ext/rope>
#include<iostream>
#include<algorithm>
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define per(i,a,b) for(int i=a;i<=b;++i)
#define max(a,b)  a>b?a:b
#define min(a,b)  a<b?a:b
#define LL long long 
#define swap(a,b) {int t=a;a=b;b=t} 
using namespace std;
//using namespace __gnu_cxx;
int main()
{
    priority_queue <LL int,vector<LL int>,greater<LL int> > q;
    LL int n,m,a,b,c;
    cin>>n>>m;
    per(i,1,n){
    	cin>>a;
    	q.push(a);
	}
	while(q.size()!=1){
		a=q.top();
		q.pop();
		b=q.top();
		q.pop();
		c=min(a*2,b*2);
		q.push(c);
	}
	c=q.top();
	cout<<c;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/PleasantlY1/article/details/82190816