首先呢,这是一道set裸题。
其实介绍这道题最大的目的其实是为了熟悉set的用法。只要学会set的基础用法,这道题自然迎刃而解了啊。(超菜的啊)
set基础操作
- 作为队列的一种,自然有插入q.insert(x) ->x是插入元素,q是队列名称。还有删除操作 q.erase(x);
--当然这题就会这些就够了啊。毕竟这是一道真·水题。
- begin() 返回指向第一个元素的迭代器
- clear() 清除所有元素
- count() 返回某个值元素的个数
- empty() 如果集合为空,返回true(真)
- end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
- find() 返回一个指向被查找到元素的迭代器
- max_size() 返回集合能容纳的元素的最大限值
- size() 集合中元素的数目
- swap() 交换两个集合变量
-->set这种队列,是一种自带排序的队列。所以在使用结构体作为插入元素时,一定要重载运算符。还有,set中是没有重复元素的。一定要注意啊。
最后代码一波带走本题AC
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<algorithm> #include<set> using namespace std; struct ss{ int k,p; bool operator < (const ss &a) const{ if(p==a.p) return k<a.k; return p<a.p; } }a; set<ss>sl; int main() { //freopen("1.txt","r",stdin); int n; while(scanf("%d",&n)==1) { if(n==1) { scanf("%d%d",&a.k,&a.p); sl.insert(a); } if(n==3) { if(sl.empty()) printf("0 "); else { a=*(sl.begin()); printf("%d ",a.k); sl.erase(a); } } if(n==2) { if(sl.empty()) printf("0 "); else { a=*(--sl.end()); printf("%d ",a.k); sl.erase(a); } } if(n==0) return 0; } return 0; }
双手奉上数据。
Input
2 1 20 14 1 30 3 2 1 10 99 3 2 2 0
Output
0 20 30 10 0
本题结束。
但是,set可不止这样--> set还支持集合中的并集,交集,差集和补集 -->(划重点!)
- 并集:
-
std::set_union()
交集:
std::set_intersection()
- 差集:
std::set_difference()
- 补集(这是个玄学,反正我理解不了怎么实现的):
std::set_symmetric_difference():这个是第一个迭代器于第二个的差集 然后再 并上第二个相对于第一个的差集
还有什么的话,想到再补充啦。(当然如果你是高端人士的话有基础,可以自行参考这篇博客:stl-set 我是从这里学的....QAQ)
那么就这样啦。谢谢。