1 条题解

  • 0
    @ 2025-11-9 19:21:31

    读题发现,对于每张马娘卡的贡献与牌堆的顺序有关,即找出在某一张马娘卡前所有支援卡提供战力的最大值。因此,为了维护支援牌堆的最大值,我们可以使用大根堆进行维护,即优先队列。在摸出每一张马娘卡时,加上优先队列的队首即可,若摸出支援卡,则加入优先队列。

    const int N=2e5+5;
    int a[N];
    priority_queue<int> pq;
    void solve(){
        while(!pq.empty()) pq.pop();
        int n;cin>>n;
        int ans=0;
        for(int i=1;i<=n;i++){
            int x;cin>>x;
            if(x==0){
                if(!pq.empty()){
                    ans+=pq.top();
                    pq.pop();
                }
                else continue;
            }
            pq.push(x);
        }
        cout<<ans<<endl;
    }
    

    由于本题数据较水,因此可以采用O(n2)O(n^2)的做法通过,思路大概是当摸到马娘卡时,O(n2)O(n^2)查找该卡之前的所有支援卡战力值,最后加上最大的值即可,此处给出一份参考代码

    const int N = 5005;
    int s[N];
    bool vis[N];
    void solve() {
        memset(vis, 0, sizeof(vis));
        int n, ans = 0;
        cin >> n;
        for(int i = 1; i <= n; i++) {
            cin >> s[i];
            if(!s[i] && i > 1) {
                int p = 0, mx = -1;
                for(int j = i - 1; j >= 1; j--) {
                    if(!vis[j]) {
                        if(mx < s[j]) {
                            mx = s[j];
                            p = j;
                        }
                    }
                }
                vis[p] = 1;
                ans += mx;
            }
        }
        cout << ans << '\n';
    }
    
    • 1

    [2025 实验室三面] 群英联赛即将举办!

    信息

    ID
    1122
    时间
    2000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    33
    已通过
    9
    上传者