洛谷-P1090-合并果子

合并果子

https://www.luogu.com.cn/problem/P1090

题目

本题欲将所有堆果子合并为一堆。每个果子重量都为 1,每合并一次消耗的体力等于两堆果子的重量之和。已知堆数和每堆果子的数量,求消耗最小体力值。

例如有 3 种果子,数目依次为 1, 2, 9。可以先将 1、 2堆合并,新堆数目为 1+2=3 ,耗费体力为 3 。接着,将新堆与原先的第三堆合并,又得到新的堆,数目为 12 ,耗费体力为 12 。所以多多总共耗费体力 为3+12=15。可以证明 15 为最小的体力耗费值。

一开始是正常的方法发现会超时,后来看题解可以用优先队列。然后就去查了优先队列…

关于优先队列

声明:priority_queue< int >q;
像这道题就是从小到大 priority_queue<int,vector< int >,greater< int> >q;
(最后两个> >之间记得加空格)
如果想从大到小可以 priority_queue<int,vector< int >,less< int > >q;
操作:q.empty() //如果队列为空,则返回true,否则返回false
q.size() //返回队列中元素的个数
q.pop() //删除队首元素,但不返回其值
q.top() //返回具有最高优先级的元素值,但不删除该元素
q.push(item) //在基于优先级的适当位置插入新元素

详细代码

#include<bits/stdc++.h>
using namespace std;
priority_queue<int,vector< int>,greater< int> >q;
int main(){
int n,a[10010],ans;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
q.push(a[i]);
}
while(q.size()>=2){
int a=q.top();
q.pop();
int b=q.top();
q.pop();
ans+=a+b;
q.push(a+b);
}
cout<<ans;
}

第一次写 如有错误欢迎指正^ _ ^

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页