set集合使用详解

set集合使用详解set集合使用详解“曾经年少爱追梦,一心只想往前飞。”那会高二,刚刚接触c语言,一发不可收拾,还记得当时为了一个想法和朋友一起想到半夜。现在我还是那个少年,那个又菜又爱玩的少年。咳咳,set集合容器,非常好哈!内部是用二叉搜索树实现的,重点是什么呢,容器内每一个元素呀,它只会出现一次,并且是排好序的,你爱了吗?复杂度更是只有O(log2n),非常高效呢。set算是竞赛里面用的比较多的了,因为,很多题目都爱考一些集合什么的。咳咳,来看看使用方式吧。上表:写法说明set

大家好,又见面了,我是你们的朋友全栈君。

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分)

题目链接:点我了解题目(这是一个链接)

给定两个整数集合,它们的相似度定义为:N​c / N​t × 100%。其中 N​c 是两个集合都有的不相等整数的个数,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晚——————————


改革尚未成功,同志仍需努力!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/132402.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • TCP四次挥手原因

    TCP四次挥手原因客户端发了一个FIN501(0)ACK701,然后服务端回了一个ACK502。。此时客户端就处于半关闭状态。至于半关闭的话,还得详细解释一下:刚开始(左边)客户端和服务端(右边)都可以互相进行通信,都能进行发送数据和接收数据,但当客户端处于半关闭时,就变成了下面这样(此图只是举个例子,没必要纠结图)这图想表达的就是,客户端(左边)只能进行接收数据,而不能发送数据,服务端(右边)能进行发送数据和接收数据这种是通过什么机制实现的呢?因为一个套接字(左右方框均可看成.

    2022年5月13日
  • 第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]

    第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令[通俗易懂]第四章:hadoop 启动wordcount实例,包括hadoop自带jar包和eclipsejar包。hdfs常用命令

    2022年4月23日
  • c# mvc webGrid 无刷新分页「建议收藏」

    c# mvc webGrid 无刷新分页「建议收藏」参考地址:http://www.dotnetcurry.com/ShowArticle.aspx?ID=618一、webGrid.css.webGrid{margin:4px;border-collapse:collapse;/*width:300px;*/}.header{background-color:#E8E8E8;font-weight:bold;color:#FFF;}.head{

    2022年10月5日
  • E: Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarly unavailable)

    E: Could not get lock /var/lib/dpkg/lock-frontend – open (11: Resource temporarly unavailable)Ubuntu安装软件报错问题错误信息E:Couldnotgetlock/var/lib/dpkg/lock-frontend-open(11:Resourcetemporarlyunavailable)解决办法:sudorm/var/lib/dpkg/lock-frontendsudorm/var/lib/dpkg/lock

    2022年10月23日
  • awk linux 数组,Linux中的awk数组的基本使用方法

    awk linux 数组,Linux中的awk数组的基本使用方法1.awk数组描述在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下标是从1开始的,在其他语言中,你可能会习惯于先“声明”一个数组,在awk中,则不用这样,直接为数组的元素赋值即可(其实如果自己给数组赋值,下标从1或者从0开始那就无所谓了!)2.在声明数组时,可能值很多…

    2022年7月19日
  • Codeblocks的断点调试步骤

    Codeblocks的断点调试步骤首先,新建一个C/C++的codeblocks项目。具体步骤如下:1.新建一个工程(project),注意路径中不要包含中文,否则后面断点调试时会出现问题2.直接选择空工程3.选择C或者C++项目即可4.点开工作空间(workspace)中的Source文件夹,即可对文件进行编辑然后,在.c或者.cpp文件中编写程序,设置断点进行调试。下面以一个…

    2022年5月11日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号