/*
集合的相似性:
1、给出多少个集合
2、每个集合多少个数字,同时给出所以us胡子
3、给出一个K,给出一对集合的序号,
4、根据给出的序号,得出相似性
保留一位数字
解题:
1、集合数组(51)
2、问题是如何实现相似性,
我要统计两个集合相同的变量的个数,
不同的变量的个数
learn && wrong:
1、迭代器写的不熟练
2、printf和scanf,不在iostream中吗
3、在st中找到相同元素的做法,find(*it) != 尾巴,而且以Y为总的元素,一直计算这招真的不错
4、输出比率,乘100,再相除,然后加上个百分号
5、用了insert和find函数,find返回迭代器
*/
include <iostream>
include <set>
include <cstdio>
using namespace std;
const int N = 51; //
set<int> st[N]; //N个集合
void compare(int x, int y) {
int totalnum = st[y].size(), samenum = 0; //不同的个数,相同的个数
for (set<int>::iterator it = st[x].begin();it != st[x].end();++it) { //遍历集合
if (st[y].find(*it) != st[y].end()) samenum++; //在st[y]中能找到相同元素 !!!
else totalnum++;
}
printf("%.1f%\n", samenum * 100.0 / totalnum); //输出比率!!!
}
int main()
{
int n, k, q, v, st1, st2;
cin>>n; //集合个数
for (int i = 1;i <= n;++i) {
cin>>k; //集合i中元素的个数
for (int j = 0;j < k;++j) {
cin>>v; //集合i中的元素v
st[i].insert(v); //将元素v中加入集合st[i]中
}
}
cin>>q; //q个查询
for (int i = 0;i < q;++i) {
cin>>st1>>st2; //欲比对的集合个数
compare(st1, st2);
}
return 0;
}
网友评论