不正经题解 - 逆推
2024-07-15 08:57:41
发布于:上海
45阅读
0回复
0点赞
首先正推显然不行,至少我口胡的几个策略都能假掉。于是倒着想,这不就是合并果子吗!我们每一次合并最短的面包,证明与哈夫曼树类似。但是不能有剩余怎么办?只需要把剩余的面包也作为“果子”合并即可。那么直接优先队列维护最小值就行了。
#include<iostream>
#include<stack>
#include<queue>
#include<vector>
using namespace std;
#define int long long
priority_queue<int,vector<int>,greater<int> > pq;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,l;
cin >> n>>l;
for(int i=1,t; i<=n; i++){
cin >> t;
l-=t;
pq.push(t);
}
if(l!=0) pq.push(l),n++;
int sum=0;
for(int i=1; i<n; i++){
int a=pq.top();
pq.pop();
int b=pq.top();
pq.pop();
sum+=a+b;
pq.push(a+b);
}
cout << sum;
return 0;
}
双倍经验:ABC252F
全部评论 1
d
2024-07-15 来自 上海
0
有帮助,赞一个