之前用一个set没有考虑到第一组数里有重复的情况
所以只能用两个set
现在还没太明白find那里
懂了 set.find()找到此数的的话就返回他在的位置
所以如果最后返回了结尾的end,说明没有相等的值
所以总数加一,如果找到了就分子加一
#include <cstdio>
#include <vector>
#include <iostream>
#include <set>
using namespace std;
set<int> all;
int n, m, k;
int main(){
scanf("%d",&n);
vector<set<int> > arr(n);
for(int i=0; i<n; i++){
scanf("%d",&m);
set<int> s;
for(int j=0; j<m; j++){
int a;
scanf("%d",&a);
s.insert(a);
}
arr[i] = s;
}
scanf("%d",&k);
for(int i=0; i<k; i++){
int a, b, x, y;
int nc = 0, nt ;
scanf("%d%d",&x,&y);
a = x - 1;
b = y - 1;
nt = arr[b].size();
set<int> :: iterator it;
for( it = arr[a].begin(); it != arr[a].end(); it++){
if(arr[b].find(*it) == arr[b].end())
nt++;
else
nc++;
}
double ans = (double)nc/nt*100;
printf("%.1f%%\n",ans);
}
return 0;
}
诸事不顺的一天吧,,