思路:用set存放数据 定义 set<int> s[51] set[i]表示第i个集合的全部元素
判断a,b集合相似度:判断a中有sum个元素也在b集合中出现 集合相似度就为:sum/(a.size()+b.size()-sum)
(a.size()+b.size()-sum)为a,b两个集合所有不相同元素的个数
例如 集合a有 87 99 101 a.size()=3
集合b有5 87 87 101 由于set集合不存放重复数据 所以 b:5 87 101
通过遍历发现a中有87,101两个元素在b中出现 所以sum=2
a,b中所有不同元素个数就为3+3-2 = 4 个 分别为5 87 99 101
集合相似度就为2/4=50%
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<set>
using namespace std;
int n,m,k;
set<int> s[51];
double f(int a,int b){
int sum=0;
set<int>::iterator i1;
for(i1=s[a].begin();i1!=s[a].end();i1++){
if(s[b].count(*i1))
sum++;
}
double gl = sum*1.0/(s[a].size()+s[b].size()-sum) * 100;
printf("%.2lf%%\n",gl);
}
int main()
{
cin>>n;
int num;
for(int i=1;i<=n;i++){
cin>>m;
for(int j=1;j<=m;j++){
cin>>num;
s[i].insert(num);
}
}
int a,b;
cin>>k;
for(int i=1;i<=k;i++){
cin>>a>>b;
f(a, b);
}
return 0;
}