大家好,又见面了,我是你们的朋友全栈君。
set集合使用详解
“曾经年少爱追梦,一心只想往前飞。”那会高二,刚刚接触c语言,一发不可收拾,还记得当时为了一个想法和朋友一起想到半夜。现在我还是那个少年,那个又菜又爱玩的少年。
- 咳咳,set集合容器,非常好哈!内部是用二叉搜索树实现的,重点是什么呢,容器内每一个元素呀,它只会出现一次,并且是排好序的,你爱了吗?复杂度更是只有 O(log2n),非常高效呢。
- set算是竞赛里面用的比较多的了,因为,很多题目都爱考一些集合什么的。
- 咳咳,来看看使用方式吧。上表:
写法 | 说明 |
---|---|
set < type > s | 定义一个集合s |
s.insert(item) | 把item放入s集合里面 |
s.erase(item) | 删除元素item |
s.clear() | 清空s集合 |
s.empty() | 判断集合是否是空的 |
s.size() | 返回集合元素个数 |
s.find(k) | 返回一个迭代器,键值指向k |
s.lower_bound(k) | 返回迭代器,键值指向不下于k的第一个元素 |
s.upper_bound(k) | 返回迭代器,键值指向大于k的第一个元素 |
- 这就是集合的操作拉,是不是很简单呢。
- 一起来看看实例吧!
- 可以看到哈,1-6,9-4,我们移动插入了11个元素,但是最后输出的元素个数确实9个,那么,这是因为set集合会自动的去除那些重复的值。
- 第二次输入值的时候,我们是反过来放入值的,但是输出的时候却是正的,这说明,他还可以排序哦。是不是超级好用!!!
- 咳咳,竟然如此,我们直接上个题目来练练。
hdu 2094 “产生冠军”
题目链接:点我了解题目(这是一个链接)
有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛。
球赛的规则如下:
如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打败C。
如果A打败了B,B又打败了C,而且,C又打败了A,那么A、B、C三者都不可能成为冠军。
根据这个规则,无需循环较量,或许就能确定冠军。你的任务就是面对一群比赛选手,在经过了若干场撕杀之后,确定是否已经实际上产生了冠军。
输入样例:
3
Alice Bob
Smith John
Alice Smith
5
a c
c d
d e
b e
a d
0
输入样例:
Yes
No
- 咳咳,很好理解哈,题目要求会不会产生冠军,那么首先哈,冠军只有一个,所以我们只要建立两个集合,一个用来装所有人,一个用来装失败的人,最后根据两个集合元素个数之差就可以判断出是否会出现冠军
- 看清楚哈,这是多项数据哦。
#include<bits/stdc++.h>
using namespace std;
int main(){
set<string > a; //a集合用来装所有参加赛事的人
set<string > b; //b集合用来装比赛失败的人
int n;
while(~scanf("%d",&n)&&n){
string s1,s2;
a.clear();
b.clear();
for(int i=0;i<n;i++){
cin >> s1 >> s2;
a.insert(s1);a.insert(s2);
b.insert(s2);
}
//cout << a.size() << " " << b.size() << endl;
if(a.size()-b.size()==1)cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}
- 咳咳,这没啥好说的哈,就是这么简单,当然啦,简单不代表你可以不去打,不打永远的抖不会知道的。所以加油吧少年。
- 再来一题,这次难一点点。冲冲冲!
- 选自天梯赛真题哦
L2-005 集合相似度 (25分)
题目链接:点我了解题目(这是一个链接)
给定两个整数集合,它们的相似度定义为:Nc / Nt × 100%。其中 Nc 是两个集合都有的不相等整数的个数,N是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入样例:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
输入样例:
50.00%
33.33%
- 做题先看题,看题先读题,好,意意思就是把两个集合里面的都相等的个数比上两个集合加在一起的集合的个数,然后按照百分比输出就好啦!
- 这里需要查找两个集合里面相等的个数,我们可以使用find方法直接去找,超级有效,如果单独创建集合去整合的话,最后大数据可能会超时哦!!!
#include<bits/stdc++.h>
using namespace std;
set<int > s[55];
int n,m;
void fun(int a,int b){
int s1=0;
int s2=0;
set<int >::iterator it;
for(it=s[a].begin();it!=s[a].end();it++){
if(s[b].find(*it)!=s[b].end())s1++;
}
s2 = s[a].size() + s[b].size() - s1;
double ans = s1 * 1.0 / s2 *100;
printf("%.2lf%%\n",ans);
}
int main(){
int n,m,x;
cin >> n;
for(int i=1;i<=n;i++){
cin >> m;
for(int j=1;j<=m;j++){
cin >> x;
s[i].insert(x);
}
}
int k;
cin >> k;
while(k--){
int a,b;
cin >> a >> b;
fun(a,b);
}
return 0;
}
-
集合对于竞赛而言还是很重要的,大概率会出题。
-
嗯嗯,学无止境,冲冲冲
——————————2020/12/18晚——————————
改革尚未成功,同志仍需努力!!!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132402.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...