题目地址: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(); }