题解 | #智乃的果子#
智乃的果子
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;
}
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;
}
查看7道真题和解析