列表

详情


NC219562. 小蓝小兰小岚小澜

描述

吃过年夜饭,小蓝小兰小岚小澜在一起打麻将。由于小兰年龄最小,大家决定给他一个特殊翻倍;
每局麻将过后,小兰可以实用超级翻倍将自己的得分变为原来的两倍,每个道具只能使用一次,每局最多只能使用一个道具。每局比赛开始之前,小兰有可能得到一定数目的道具,她可以自由的选择对以前发生的哪几局比赛使用道具。小兰想知道她最多可以得到多少分数。具体表述如下:
共有Q(1Q105)个操作,每个操作包含两个整数,opX
    1.op=1:小兰得到X(1X5)个超级翻倍
    2.op=2:四个人打了一局麻将,小兰得到X(|X|109)
每次操作之后,求小兰总共能得到的最大分数

输入描述

第一行一个正数Q,代表操作数
接下来Q行,每行两个整数op和X

输出描述

输出Q行,每行一个整数S代表小兰总共能得到的最大分数

示例1

输入:

5
1 2
2 1
2 2
2 3
2 4

输出:

0
2
6
11
17

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 164ms, 内存消耗: 2832K, 提交时间: 2021-03-25 18:34:17

#include <bits/stdc++.h>
#define pb push_back
#define ll long long
using namespace std;
///////////
const int N=1e6+10;
void sovle()
{

}
int main()
{
    int t;
    cin>>t;
    priority_queue<int>a;
    priority_queue<int>b;
    ll sum=0;
    ll ans=0;
    while(t--)
    {
        int x,y;
        cin>>x>>y;
        if(x==1)
        {
            sum+=y;
        }
        if(x==2)
        {
            ans+=y;
            if(!b.empty()&&-b.top()<y)
            {
                int tmp=-b.top();
                b.pop();
                b.push(-y);
                a.push(tmp);
                ans=ans-tmp+y;
            }
            else if(y>0)
            {
                a.push(y);
            }
        }
        while(b.size()<sum&&!a.empty())
        {
            int tmp=a.top();
            a.pop();
            ans+=tmp;
            b.push(-tmp);
        }
        cout<<ans<<endl;
    }
    return 0;
}

上一题