地址:https://www.luogu.com.cn/problem/P1090
解析:
要想最后花费最少,肯定每次要加入两个最小值。
所以贪心思路,就是每次取剩余堆的两个最小值相加,相加以后,把它放入队列。
使用优先队列实现:
priority_queue<int,vector<int>,greater<int> > q;//优先为小的优先队列
因为合并所有,最多也就是n-1次,所以for遍历n-1次即可。
#include<cstdio> #include<stack> #include<map> #include<set> #include<queue> #include<cstring> #include<iostream> #include<algorithm> using namespace std; priority_queue<int,vector<int>,greater<int> > q;//优先为小的优先队列 typedef long long ll; const int maxn=1e5+20; int a[maxn]; struct node { ll l,r; }st[maxn]; bool cmp(node a , node b) { if(a.l==b.l) return a.r<b.r; return a.l<b.l; } int main() { // 4 0 20 int n; cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; q.push(a[i]); } if(n==1) cout<<a[1]<<endl; else { int sum=0,md=0; for(int i=1;i<n;i++) { int a=q.top(); q.pop(); int b=q.top(); q.pop(); sum+=a+b; q.push(a+b); } cout<<sum<<endl; } }