双十一吃土

吃土

时间限制: 1000 ms 内存限制: 65536 kb
总通过人数: 132 总提交人数: 133

题目描述

输入

多组测试数据(不超过10组),每组数据两行

第一行为一个正整数N(N<=10000),表示排队挖土的总人数

第二行为N个正整数a1,a2,,,an(INT范围内),表示每个人挖土所需的时间

输出

对于每组数据,输出一行,表示等待时间之和的最小值

输入样例

5
1 2 3 4 5

输出样例

20

题目来源:http://biancheng.love/contest/17/problem/A/index

解题分析:
按照题目定义,当挖土的时间排序为a1,a2,....an,时,所消耗的时间为T= ∑(i=1->n)(n-i)*ai; 因此当所消耗时间最少时,挖图时间的排序序列应改为非递减排序。因此可以调用库函数的sort,也可以使用前些天提到的优先队列。
代码实现:
 1 #include <bits/stdc++.h>
 2 #define max_size 10010
 3 long long a[max_size];
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     int n;
 9     while(~scanf("%d",&n))
10     {
11         for(int i=1;i<=n;i++)
12             scanf("%lld",&a[i]);
13         sort(a+1,a+n+1);
14         long long ans=0;
15         for(int i=1;i<=n;i++)
16         {
17             ans+=(n-i)*a[i];
18         }
19         printf("%lld
",ans);
20     }
21 }

另附优先队列实现:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n;
 8     while(~scanf("%d",&n))
 9     {
10         long long num;
11         priority_queue<long long,vector<long long>,greater<long long> >que;
12         for(int i=1;i<=n;i++)
13         {
14             scanf("%lld",&num);
15             que.push(num);
16         }
17         long long kase=1;
18         long long ans=0;
19         while(!que.empty())
20         {
21             ans+=(n-kase)*que.top();
22             que.pop();
23             kase++;
24         }
25         printf("%lld
",ans);
26     }
27 }

注意事项:计算结果较大请使用long long 数据类型。

 
原文地址:https://www.cnblogs.com/zpfbuaa/p/4963988.html