Wannafly挑战赛2 Cut

题目描述

给你一个长度为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

不难看出答案就是从小到大排序后a1*1+a2*2+...+an-1*(n-1)+an*(n-1).
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 100000;
 4 #define ll long long
 5 int a[N];
 6 int main() {
 7     int n;
 8     cin >> n;
 9     for(int i = 1; i <= n; i ++) cin >> a[i];
10     sort(a + 1, a + 1 + n);
11     ll sum = 0;
12     for(int i = 1; i <= n; i ++) {
13         sum += 1LL*i*a[i];
14     }
15     cout << sum - a[n]<< endl;
16     return 0;
17 }

 

posted @ 2017-10-27 23:05  starry_sky  阅读(312)  评论(0编辑  收藏  举报