题意
一个长度为n的序列,一次可将一个序列分割成两个连续的的子序列,分割的代价为原序列的总和,求分成n个子序列需要的最大代价。
题解
反过来思考,令其从n个长度为1的序列合成为一个长度为n的序列。每次合成代价为两序列之和。这时这道题就跟合并果子题十分相似了(合并果子),只需将小根堆换成大根堆即可得到最大代价。
注意数据范围,需要开long long
Code
#include <bits/stdc++.h>
using namespace std;
priority_queue<long long> pq; //大根堆
int main()
{
int n;
scanf("%d",&n);
for(int i = 0;i < n;++i){
long long tmp;
scanf("%lld",&tmp);
pq.push(tmp);
}
long long res = 0;
while(pq.size() > 1){ //所剩序列在2个及以上
long long a = pq.top();pq.pop();
long long b = pq.top();pq.pop();
res += a+b; //合并
pq.push(a+b);
}
printf("%lld\n",res);
return 0;
} 
京公网安备 11010502036488号