PTAL2-005 集合相似度 (25分)和set的用法

思路:

利用set数组分别存取每一个集合,set的特性是自动从小到大排序且没有重复元素。两个集合之间比较,如果第二个集合中的元素在第一个集合中找到,则相同元素+1;

详情代码有注释~~

#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<set>
using namespace std;
set<int> s[55];
void check(int x, int y)
{
	int c, t;//NC Nt
	t = s[x].size() + s[y].size();//把两个集合的所有元素个数相加
	c = 0;//共同元素
	set<int>::iterator it;//迭代器
	for (it = s[x].begin(); it != s[x].end(); it++)//迭代器遍历,end()指向最后一个元素的下一位的索引
	{
		if (s[y].count(*it) == 1)//判断s[y]中是否有元素*it
		{
			c++;//相同元素个数
			t--;//相异元素个数
		}
	}
	cout << fixed << setprecision(2) << (double)c / t *100<< "%" << endl;//控制输出格式,控制输出两位小数

}
int main()
{
	int n, k, x, y;
	int m;
	while (cin >> n)
	{
		for (int i = 1; i <= n; i++)
		{
			s[i].clear();//初始化set
			cin >> m;
			for (int j = 1; j <= m; j++)
			{
				cin >> x;
				s[i].insert(x);//将数插入set中,每个集合的元素
			}
		}
		cin >> k;
		for (int i = 1; i <= k; i++)
		{
			cin >> x >> y;
			check(x, y);//选取要比较的集合编号
		}
	}
	

	system("pause");
	return 0;
}

 这道题的关键是set的使用,下列详细介绍一下set的用法!

注意:

1、set中的元素都是排好序的

2、set集合中没有重复的元素

2.set中常用的方法


begin()        ,返回set容器第一个元素的迭代器

end()      ,返回一个指向当前set末尾元素的下一位置的迭代器.

clear()          ,删除set容器中的所有的元素

empty()    ,判断set容器是否为空

max_size()   ,返回set容器可能包含的元素最大个数

size()      ,返回当前set容器中的元素个数

rbegin()     ,返回的值和end()相同

rend()     ,返回的值和begin()相同

上面返回的是元素的索引,要用迭代器来获取元素的值。

看例子:

#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
     set<int> s;
     s.insert(1);
     s.insert(2);
     s.insert(3);
     s.insert(1);
     cout<<"set 的 size 值为 :"<<s.size()<<endl;
     cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
     cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
     cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
     s.clear();
     if(s.empty())
     {
         cout<<"set 为空 !!!"<<endl;
     }
     cout<<"set 的 size 值为 :"<<s.size()<<endl;
     cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
     return 0;
}

答案:

#include<stdio.h>  
#include<set>  
using namespace std;  
int main()  
{  
    set<int>s;  
    s.insert(3);   
    s.insert(1);  
    s.insert(2);  
    s.insert(1);  
    set<int>::iterator it;              
    for(it=s.begin();it!=s.end();it++)  //使用迭代器进行遍历   
    {  
        printf("%d\n",*it);  
    }  
    return 0;  
}  
//输出结果 : 1 2 3     一共插入了4个数,但是集合中只有3个数并且是有序的,可见之前说过的set集合的两个特点,有序和不重复。

 小结:插入3之后虽然插入了一个1,但是我们发现set中最后一个值仍然是3哈,这就是set 。还要注意begin() 和 end()函数是不检查set是否为空的,使用前最好使用empty()检验一下set是否为空

count() 用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。(这个很常用,也很好用!!)

例子:

#include <iostream>
#include <set>
 
using namespace std;
 
int main(){
     set<int> s;
     s.insert(1);
     s.insert(2);
     s.insert(3);
     s.insert(1);
     cout<<"set 中 1 出现的次数是 :"<<s.count(1)<<endl;
     cout<<"set 中 4 出现的次数是 :"<<s.count(4)<<endl;
     return 0;
}

 结果:

 find()  ,返回给定值值得定位器,如果没找到则返回end()。

示例代码:

#include <iostream>
#include <set>
 
using namespace std;
 
int main()
{
     int a[] = {1,2,3};
     set<int> s(a,a+3);
     set<int>::iterator iter;
     if((iter = s.find(2)) != s.end())
     {
         cout<<*iter<<endl;
     }
     return 0;
}

常用的就是上面这些了~~

求赞!!

猜你喜欢

转载自blog.csdn.net/weixin_43535668/article/details/104381291