题目
题目地址
合并两个数要消耗他们的和,我们要把所有数合并,要求消耗最小。
题解思想
非常明显的贪心,但由于不熟练STL最开始我只想着排序一次做,这样忽略了每次的最小值可能会更新,这样就导致的第一次的WA。优先队列的好处在于代码量小,而且每次都会更新队列。这样我们取一个由小到大的优先队列,每次取出第一 二个相加再将其之和入队即可。 再用一个变量加上每次合并的值最后输出即可。
创建优先队列操作(注意第二个操作的大于号前要空格)
priority_queue<int> a; //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>,greater<int> > b; //通过操作,按照元素从小到大的顺序出队
基操(这个要熟悉)
empty() 如果队列为空,则返回为真
pop() 删除队顶元素,删除第一个元素
push() 添加 一个元素
size() 返回优先队列中的元素个数
top() 返回优先队列的队顶,即返回优先队列中具有最高级的元素
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
//优先队列
int main ()
{
int n;
priority_queue<int,vector<int>,greater<int> > m;
while(scanf("%d",&n))
{
if(n==0)
return 0;
for(int i=1;i<=n;i++)
{
int j;
scanf("%d",&j);
m.push(j);
}
int sum=0;
while(m.size()!=1)
{
int a,b;
a=m.top();
m.pop();
b=m.top();
m.pop();
sum+=a+b;
m.push(a+b);
}
m.pop();
printf("%d\n",sum);
}
return 0;
}