CSU 1554 SG Value (集合类的学习)

题目大意:

2种操作

1 a:往集合中添加一个元素a

2: 询问这个集合中的元素任意组合相加所不能得到的最小数的值

 

这道题总是不断地去找当前所能处的最小值能否被当前的最小值加上其前部的一堆可抵达数到达当前位置

也就是 minn < *s.begin() , 说明此时内部最小的元素是不影响这个值的,否则 minn+=*s.begin(),然后剔除最小值,不断往下访问

在这里因为相同数据也可以同时保存在集合内,所以不采用set(会删除重复元素),而是使用multiset。

 

在这里顺便学习理解一下multiset类的使用

 
multiset中的数据保存是通过平衡二叉树来实现,其内部总是将最小的元素的地址定义为头指针,begin(),也就是说如果不停的从
头指针开始往下删除元素那么它总会先删除其内部所含的最小的元素
可以理解为优先队列的由小到大排列
 
使用set或multiset之前,必须加入头文件<set>

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 }

 

转载于:https://www.cnblogs.com/CSU3901130321/p/4375976.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值