题目
使用优先队列解决
#include <iostream>
#include<queue>
using namespace std;
long long ans;
int main()
{
int n;cin>>n;
int x;
priority_queue<long long,vector<long long>,greater<long long> >q;
for(int i=0;i<n;i++)
{
cin>>x;
q.push(x);
}
///特判n=1,n=2的情况
if(n==1) cout<<q.top();
if(n==2)
{
int x=q.top();q.pop();
cout<<x+q.top();
}
else
{
while(q.size()>=2)///当q.size()==2时,就将所有的取出了
{
///每次取出最小的两个
long long x1=q.top();
q.pop();
long long x2=q.top();
q.pop();
///合并,再入队
ans+=x1+x2;
q.push(x1+x2);
}
cout<<ans;
}
}
本文介绍了一种使用优先队列(最小堆)解决特定问题的方法,该问题旨在找到将数组中所有元素通过两两合并操作达到单一元素所需的最小代价。通过C++实现,详细展示了如何利用优先队列来高效地解决此类问题,适用于算法竞赛和数据结构学习。
621

被折叠的 条评论
为什么被折叠?



