题解 | #智乃的果子#

智乃的果子

https://ac.nowcoder.com/acm/contest/120565/D

D题
(本题参考大佬思路)由题意得,要根据果子的重量从小到大依次合并,在选择记录个数和重量时,如果用数组的话由于两堆合并时重量翻倍,数组会爆,可以用优先队列结合二元组来记录(用map也可以,建议去看大佬写的),具体思路就是一直循环,分类讨论合并,合并时整合答案并取模,当再次取出队首时,队空并且取出的队首个数为一时就可以退出循环了
#include <bits/stdc++.h>
using namespace std;
#define pii pair<long long,long long>
long long m=1000000007;
int main(){
    int n;cin>>n;
    long long ans=0;
    long long mn=0;
    priority_queue<pii,vector<pii>,greater<pii>> q;
    for(int k=1;k<=n;k++){
        long long c,w;cin>>c>>w;
        pii pr={w,c};
        q.push(pr);
    }
    while(1){
        pii now=q.top();
        auto x=now.first;
        auto y=now.second;
        q.pop();
        if(y==1){
            if(q.empty()) break;
            else{
                pii pr=q.top();
                q.pop();
                auto x1=pr.first;
                auto y1=pr.second;
                y1--;
                ans=(ans+x1+x)%m;
                q.push({x+x1,1});
                if(y1!=0) q.push({x1,y1});
            }
        }
        else{
            if(y%2==0){
                ans=(ans+x*y)%m;
                q.push({2*x,y/2});
            }
            else{
                ans=(ans+x*(y-1))%m;
                q.push({2*x,y/2});
                q.push({x,1});
            }
        }
    }
    cout<<ans;
}

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务