修理牧场
原题:https://pintia.cn/problem-sets/15/problems/856
题目要求:

这个题目的思路还是比较简单的,将输入的数存入一个数组,进行重大到小的排序,然后将最后两个数相加,并删除最后两个数,将相加的结果插入数组,再次排序,直到数组中只有一个元素。一开始我用的是vector容器实现,发现超时了:
#include
#include
#include
#include
using namespace std;
//int Solution(int n, vector v)
//{
// sort(v.begin(), v.end(), greater());
// int sum = 0, m;
// while (v.size() > 1)
// {
// m = v[v.size() - 1] + v[v.size() - 2];
// sum += m;
// v.erase(v.end() - 2, v.end());
// v.push_back(m);
// sort(v.begin(), v.end(), greater());
// }
// return sum;
//}
//int main()
//{
// int m, n;
// vector v;
// scanf("%d", &n);
// for (int i = 0; i < n; i++)
// {
// scanf("%d", &m);
// v.push_back(m);
// }
// printf("%d\n", Solution(n, v));
//}
确实可以看出来函数里面的步骤有点复杂。然后我发现优先队列非常契合这个算法,然后就用优先队列实现了:
#include
#include
using namespace std;
priority_queue<int, vector, greater> Q;
int main()
{
int m, n;
scanf_s("%d", &n);
for (int i = 0; i < n; i++)
{
scanf_s("%d", &m);
Q.push(m);
}
int sum = 0;
while (Q.size() > 1)
{
int a = Q.top();
Q.pop();
int b = Q.top();
Q.pop();
Q.push(a + b);
sum += a + b;
}
printf("%d", sum);
}
scanf和printf的速度要快于cin和cout。
