首页 > 代码库 > UVA-10954 Add All

UVA-10954 Add All

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1895

题目大意:类似于这道题UESTC - 1599 

就是将所有的数字最后合并为一个数字,但是每次合并需要的消耗值是等于两个数的和,求最小的消耗值。

当然是贪心,每次排序后合并最小的两个值,再题弹出那两个值,压入两值之和。再继续刚才的步骤,直到只要一个了。

用sort肯定是超时的,会自动排序的容器当然是最好的选择。用multiset就行。

AC代码:

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<set>
 4 using namespace std;
 5 int main()
 6 {
 7     int n;
 8     while(cin>>n)
 9     {
10         if(n==0)break;
11         multiset<int> s;
12         multiset<int>::iterator it;
13         int x;
14         for(int i=0;i<n;i++)
15         {
16             scanf("%d",&x);
17             s.insert(x);
18         }
19         long long int body=0;
20         int t;
21         while(s.size()!=1)
22         {
23             it=s.begin();
24             body+=(*it);
25             t=*it;
26             s.erase(it);
27             it=s.begin();
28             body+=(*it);
29             t+=(*it);
30             s.erase(it);
31             s.insert(t);
32         }
33         cout<<body<<endl;
34     }
35     return 0;
36 }

 

UVA-10954 Add All