题目链接
UVa 10954
方法:multiset erase单个位置的元素
题目分析
题目大意
给定n个数,每取两个数a、b,就要花费a+b元,然后把a、b两个数从这n个数中剔除,并且把a+b放入剩下的n-2个数中,形成n-1个数字。以此类推,问,把所有数都取完总个需要多少元。
解析
题目希望尽可能的贪心,把所有的数字都取出来,并且取的是最小的两个数字,所以第一反应是set,但是有重复数字怎么办?用multiset。但是multiset怎么erase呢?尝试了如果集合内容为{1,2,3,3,3,4},erase(3)之后的结果是{1,2,4},显然与我们想要的不符,所以新学了一招,erase单个元素的位置。具体方法如下。
1 | multiset<int>st; //我们定义的集合 |
掌握这个方法,这题就很好做了,取set的前两个数a、b,算出a+b,加到总cost里,然后再insert(a+b),直至只有一个元素。
代码
1 |
|