解题思路:运用set进行对输入的集合的进行去重,最后根据选择的两个集合进行遍历,找到共有的部分,然后进行计算相似度
(理解题意后,可以提炼出相似度的计算方法为: 找出去重后两集合的相同元素个数 cnt,再用 (cnt / (去重后集合A的大小 + 去重后集合B的大小 - cnt) ) * 100% )
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,num,k,a,b;
cin>>n;
vector<set<int>>v(n);
for(int i=0;i<n;i++){
set<int>st;
cin>>m;
for(int j=1;j<=m;j++){
cin>>num;
st.insert(num);
}
v[i]=st;
}
cin>>k;
for(int i=0;i<k;i++){
cin>>a>>b;
int common=0;
for(auto it = v[a-1].begin(); it != v[a-1].end(); it++) {
if(v[b-1].find(*it) != v[b-1].end())
common++;
}
printf("%.2lf%%\n", 100.0 * common / (v[a-1].size() + v[b-1].size() - common));
}
}
运行结果: