题目地址: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();
}
京公网安备 11010502036488号