NO GAME NO LIFE(優先佇列/最小堆)

大白QQly成長日記發表於2018-08-29

題目描述

輸了不感到悔恨的人,沒資格當遊戲玩家,不過正因為如此,才會第一次覺得快樂  

在網路上成為都市傳說的天才玩家兄妹·空和白實際是家裡蹲尼特族。他們將將世界稱為“垃圾遊戲”。某天,這兩個人某一天被自稱“神”的少年召喚到了異世界。那是被神明禁止了戰爭,一切交由遊戲來決定"的世界——沒錯,就連國境線也是一樣。被其他種族逼入絕境,只剩下最後一座都市的“人類種”。空和白,兩名廢人兄妹到底能否在異世界成為“人類的救世主”?——那麼,讓我們開始遊戲吧,

  空白兩人遇到了這樣一個遊戲,一款類似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;
}

 

相關文章