NC14291 Cut
传送门:https://ac.nowcoder.com/acm/problem/14291
题目描述
给你一个长度为n的序列,你每次可以将一个序列分割成两个连续的的子序列,分割的代价为原序列的总和。现在允许你在初始时将序列重新排列一次。问分割成n个长度为1的序列的最大总代价是多少?
输入描述:
第一行一个数n表示原序列的长度;
接下来一行n个数a_i表示原序列的第i个数。
2<=n<=100000
0<=a_i<=10000
输出描述:
一行一个整数表示答案。
示例1
输入
4
3 2 4 1
输出
26
说明
[3,2,4,1]重排->[1,2,3,4]->[1],[2,3,4]->[1],[2],[3,4]->[1],[2],[3],[4]。
示例2
输入
4
1 1 1 1
输出
9
需要注意的是ans变量必须的long long类型的。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1e5+5;
int arr[maxn],n;
long long ans = 0,tmp;
int main() {
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",arr+i);
sort(arr,arr+n);
tmp = arr[n-1];
for(int i=n-2;i>=0;i--) {
tmp += arr[i];
ans += tmp;
}
cout << ans << endl;
return 0;
}