题目地址:https://ac.nowcoder.com/acm/problem/14291
思路:这道题是一道很明显的贪心题目,要使得代价最大,肯定是每次切割将最小的切掉,这样后续更大的数,在计算代价的时候会被多次累加,从而达到最大的目的。
所以做法就是: 先排序,然后每次将最小的元素分割掉,这样总代价就相当于
图片说明
为什么要减去a[n],最后只剩两个元素时只要分割一次,所以最大的一个元素只会被计算到n-1次。
下面是代码:

#include <iostream>
#include <cstdio>      //定义输入/输出函数
#include <stack>      //STL 堆栈容器
#include <map>       //STL 映射容器
#include <vector>     //STL 动态数组容器
#include <string>     //字符串类
#include <iterator>        //STL迭代器
#include <cstdlib>     //定义杂项函数及内存分配函数
#include <cstring>     //字符串处理ed
#include<algorithm>
#include<queue>
#include<cmath>
#include<ctime>
using namespace std;
#define FOR(ITER,BEGIN,END)  for(int  ITER=BEGIN;ITER<END;ITER++)
#define PER(ITER,TIMES) FOR(ITER,0,TIMES)
#define close_stdin  ios::sync_with_stdio(false)
const int maxn = 1e5 + 5;
int a[maxn],n;
long long ans=0;
void my_input() {
    cin >> n;
    for (int i = 1;i <= n;i++) {
        cin >> a[i];
    }
}
void solve() {
    sort(a + 1, a + 1 + n);
    for (int i = 1;i <= n;i++) {
        ans += i * a[i];
    }
    ans -= a[n];
    printf("%lld", ans);
}
int main() {
    close_stdin;
    my_input();
    solve();
}