一、解题思路
从下到上逆推
1、先模拟出最后一次切割,一定是切割当前最小的两个
2、然后逐层向上,推出每一次都是切割最小的两个
太多了我也说不清,我只是造了一组数据 4 9 7 5 6,推出了一些规律和逻辑感觉。
二、代码
#include <iostream>
#include <queue>
using namespace std;
typedef long long ll;
priority_queue<int, vector<int>, greater<int>> que;
ll ans = 0LL;
int num[20007], N;
ll board = 0LL;
void input()
{
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
scanf("%d", &num[i]);
que.push(num[i]);
}
}
void solve()
{
while (que.size() > 1)
{
int topVal = que.top();
que.pop();
int secVal = que.top();
que.pop();
ans = ans + topVal;
ans = ans + secVal;
que.push(topVal + secVal);
}
printf("%lld\n", ans);
}
int main()
{
input();
solve();
return 0;
}