multiset跟set具有相同功能,但允许重复的元素。
multiset容器的内部结构通常由平衡二叉树(balanced binary tree)来实现。当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序。这种自动排序的特性加速了元 素查找的过程,但是也带来了一个问题:不可以直接修改set或multiset容器中的元素值,因为这样做就可能违反了元素自动排序的规则。如果你希望修 改一个元素的值,必须先删除原有的元素,再插入新的元素。
//
// main.cpp
// NYOJ-55 懒省事的小明
// 贪心算法:每次取最小二个合堆(这样大的重复次数少从而总和最小)
// Created by H@L on 14-6-30.
// Copyright (c) 2014年 Hzw. All rights reserved.
//
#include<iostream>
#include <set>
#include <algorithm>
using namespace std;
int main()
{
int N;
cin >> N;
while (N--) {
int n;
multiset<long> vBuf;
cin >> n;
while (n--) {
long a;
cin >> a;
vBuf.insert(a);
}
long long lPower = 0;
while (vBuf.size() > 1) {
long lTemp;
lTemp = *(vBuf.begin()) + *(++vBuf.begin()); //取最小二个元素值和
vBuf.erase(vBuf.begin());//删除
vBuf.erase(vBuf.begin());
vBuf.insert(lTemp);
lPower += lTemp;
}
cout << lPower << endl;
}
return 0;
}