1.[NOIP2004]合并果子
思路:这是一道贪心题,要想使消耗的体力最小,那么我们每次合并最小的两个数,一直重复该操作到只剩下最后一个数即可;
至于如何取最小的两个数,我们可以使用优先队列来实现
#include <bits/stdc++.h>
using namespace std;
#define f(n) for(int i=1;i<=n;i++)
#define fo(m) for(int j=1;j<=m;j++)
#define mem(a,b) memset(a,b,sizeof(a))
const int N=1e6;
int n,m;
string s;
const int mod=1e9+7;
typedef long long ll;
void solve()
{
priority_queue<int,vector<int>,greater<int> >q;
cin>>n;
ll ans=0;
ll sum=0;
f(n)
{
cin>>m;
q.push(m);
}
while(q.size()>=2)
{
sum+=q.top();
q.pop();
sum+=q.top();
q.pop();
ans+=sum;
q.push(sum);
sum=0;
}
cout<<ans<<endl;
}
int main()
{
// int t;
// cin>>t;
// while(t--)
// {
solve();
// }
return 0;
}