题目链接 L2-005 集合相似度
有关集合的交集差集并集运算可以参考原 STL算法-交集,并集,差集,对称差
常见模板
vector<int>t;
t.clear();
vector<int>::iterator retEndPos;
t.resize(set1.size());
retEndPos=set_intersection(set1.begin(),set1.end(),
set2.begin(),set2.end(),
t.begin());//set1,set2均为set<int>
t.resize(retEndPos-t.begin());
必须注意:t为vector<int>而非set<int>
满分解
#include<bits/stdc++.h>
using namespace std;
double ans[51][51];
set<int> in[50];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int nn,t;
scanf("%d",&nn);
for(int j=0;j<nn;j++){
scanf("%d",&t);
in[i].insert(t);
}
}
// cout<<"running"<<endl;
for(int i=0;i<n;i++){
ans[i][i]=1;
for(int j=i+1;j<n;j++){
vector<int>t; t.clear();
vector<int>::iterator retEndPos;
t.resize(in[i].size());
retEndPos=set_intersection(in[i].begin(),in[i].end(),
in[j].begin(),in[j].end(),t.begin());
t.resize(retEndPos-t.begin());
int interS=t.size();
int diff=in[i].size()+in[j].size()-t.size();
ans[i+1][j+1]=(double)interS/(double)diff;
ans[j+1][i+1]=ans[i+1][j+1];
//cout<<1;
}
}
// cout<<"Ok"<<endl;
int m;
cin>>m;
int a,b;
for(int i=0;i<m;i++){
scanf("%d %d",&a,&b);
printf("%.2lf%%\n",ans[a][b]*100);
}
return 0;
}