思路:
利用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;
}
常用的就是上面这些了~~
求赞!!