先排序,取出两个最小的拼成一段,然后插到队列中使其保证有序,不段操作,直到全部拼完,这样能保证所得结果最小
#include<cstdio>
#include<algorithm>
#include<deque>
using namespace std;
namespace
{
typedef long long ll;
int N;
deque<ll> Q;
void solve()
{
sort(Q.begin(), Q.end());
ll res = 0, temp;
while (Q.size() > 1)
{
ll a = Q.front();
Q.pop_front();
ll b = Q.front();
Q.pop_front();
temp = a + b;
res += temp;
if (temp > Q.back())
Q.push_back(temp);
else
for (deque<ll>::iterator it = Q.begin(); it != Q.end(); it++)
if (*it >= temp)
{
Q.insert(it, temp);
break;
}
}
printf("%lld\n", res);
}
}
int main()
{
while (scanf("%d", &N) != EOF)
{
ll temp;
Q.clear();
while (N--)
{
scanf("%lld", &temp);
Q.push_back(temp);
}
solve();
}
return 0;
}