分析:很经典的贪心问题,每次都取最小的!
优先队列相关知识
1,队列先进先出
2,默认返回最大元素
3
#include<bits/stdc++.h>
#include<queue>
#include<vector>
using namespace std;
struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
int main()
{
ios::sync_with_stdio(false);
int t,n,m;
int a,b;
int sum;
cin>>t;
while(t--)
{
sum=0;
cin>>n;
priority_queue<int,vector<int>,cmp1> que;//返回最小的元素
for(int i=0;i<n;i++)
{
cin>>m;
que.push(m);
}
while(que.size()!=0)
{
if(que.size()==1)
{
cout<<sum<<endl;
break;
}
a = que.top();
que.pop();
b = que.top();
que.pop();
sum+=a+b;
que.push(a+b);
}
}
return 0;
}
当时在场上用了一种类似优先队列方法,反正很复杂
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
int n;
int sum;
int a[10001];
while(cin>>t)
{
while(t--)
{
memset(a,0,sizeof(a));
cin>>n;
sum=0;
for(int i=1;i<=n;i++)
cin>>a[i];
int j=1;
while(1)
{
sort(a+j,a+n+1);
a[j+1]=a[j+1]+a[j];
sum+=a[j+1];
if(j==n)
break;
j++;
}
cout<<sum-a[n]<<endl;
}
}
return 0;
}