【NYNUOJ-1152】NO GAME NO LIFE

1152: NO GAME NO LIFE
时间限制: 1 Sec 内存限制: 128 MB
提交: 30 解决: 19
[提交][状态][讨论版][命题人:16680340122]
题目描述
输了不感到悔恨的人,没资格当游戏玩家,不过正因为如此,才会第一次觉得快乐

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

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

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

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

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

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

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

第二行 n个数

输出
一个数表示最大值
样例输入
5 10
6 10 7 5 4
样例输出
24
提示
答案可能会爆int
很巧妙的一道题,维护一个优先队列,每次把栈顶取出再放回。
最后输出栈顶元素。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue<ll,vector<ll>,greater<ll> > que;
int main(){
    ll n,m,x;
    scanf("%lld %lld",&n,&m);
    for(ll i=1;i<=n;i++){
        scanf("%lld",&x);
        que.push(x);
    }
    while(que.size()>1){
        ll ans=que.top();
        que.pop();
        que.pop();
        que.push(ans*2);
    }
    printf("%lld\n",que.top());
    return 0;
}

猜你喜欢

转载自blog.csdn.net/duanghaha/article/details/82218841