题目大意:
2种操作
1 a:往集合中添加一个元素a
2: 询问这个集合中的元素任意组合相加所不能得到的最小数的值
这道题总是不断地去找当前所能处的最小值能否被当前的最小值加上其前部的一堆可抵达数到达当前位置
也就是 minn < *s.begin() , 说明此时内部最小的元素是不影响这个值的,否则 minn+=*s.begin(),然后剔除最小值,不断往下访问
在这里因为相同数据也可以同时保存在集合内,所以不采用set(会删除重复元素),而是使用multiset。
在这里顺便学习理解一下multiset类的使用
Set、multiset都是集合类,差别在与set中不允许有重复元素,multiset中允许有重复元素
1.增加,删除函数
pair<iterator,bool> insert( x):插入元素x
iterator insert(iterator it,x):在迭代器it处插入元素x
void insert(const value_type *first,const value_type *last):插入[first, last)之间元素
iterator erase(iterator it):删除迭代器指针it处元素
iterator erase(iterator first,iterator last):删除[first, last)之间元素
size_type erase(const Key& key):删除元素值等于key的元素
我们尽量在函数中利用指针来作为参数
2.遍历函数
iterator begin():返回首元素的迭代器指针
iterator end():返回尾元素的迭代器指针
reverse_iterator rbegin():返回尾元素的逆向迭代器指针
reverse_iterator rend():返回首元素前一个位置的迭代器指针
3. 操作函数
const_iterator lower_bound(const Key& key):返回容器中大于等于key的迭代器指针
const_iterator upper_bound(const Key& key):返回容器中大于key的迭代器指针
int count(const Key& key) const:返回容器中元素等于key的元素的个数
pair<const_iterator,const_iterator> equal_range(const Key& key) const:返回容器中元素值等于key的迭代指针[first, last) const_iterator find(const Key& key) const:查找功能,返回元素值等于key的迭代器指针
void swap(set& s):交换集合元素
void swap(multiset& s):交换多集合元素
1 #include <cstdio> 2 #include <cstring> 3 #include <set> 4 using namespace std; 5 #define ll long long 6 multiset<int> s; 7 8 int main() 9 { 10 int n , op , v; 11 while(scanf("%d" , &n) != EOF) 12 { 13 while(!s.empty()) s.erase(s.begin()); 14 ll minn=1; 15 for(int i=0 ; i<n ; i++){ 16 scanf("%d" , &op); 17 if(op == 1){ 18 scanf("%d" , &v); 19 s.insert(v); 20 } 21 else{ 22 while(!s.empty() && minn>=*s.begin()){ 23 minn += *s.begin(); 24 s.erase(s.begin()); 25 } 26 printf("%lld\n" , minn); 27 } 28 } 29 } 30 return 0; 31 }