STL大法好!!!
大致思路如下:建立一个外核vector内核set的二维数组。然后每个set就代表着一个集合。接收数据后,比如查集合A和集合B,首先让nc=0,nt=B的大小。然后遍历A中数在B中找(用到find函数)如果能找到说明是共有的就nc++,没找到说明在并集中让nt++;代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m,x;
vector<set<int>>v;
int main()
{
cin>>n;
v.resize(n+1);
for(int i=1;i<=n;i++)
{
cin>>m;
while(m--)
{
cin>>x;
v[i].insert(x);
}
}
cin>>m;
while(m--)
{
int a,b,nc=0,nt=0;
cin>>a>>b;
nt=v[b].size();
for(auto it=v[a].begin();it!=v[a].end();it++)
if(v[b].find(*it)==v[b].end()) nt++;
else nc++;
double ans=nc*1.0/nt*100;
printf("%.2lf%%\n",ans);
}
}