思路:直接利用algorithm库中的集合的交操作即可。并集元素个数的等于两个集合元素个数相加 - 交集元素个数。
但是注意不能在直接求并集了,太浪费时间,会超时。
不知道集合的交并补差对应的函数的,可以参考我之前的一篇博客set相关,在中间那一部分
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 55;
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
int n;
set<int> s[MAXN];
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
int m; scanf("%d", &m);
while (m--)
{
int x; scanf("%d", &x);
s[i].insert(x);
}
}
int k;
scanf("%d", &k);
while (k--)
{
int a, b;
scanf("%d%d", &a, &b);
set<int> ans1, ans2;
set_intersection(ALL(s[a]), ALL(s[b]), INS(ans1));
//set_union(ALL(s[a]), ALL(s[b]), INS(ans2)); //会超时
double nc = ans1.size(), nt = s[a].size() + s[b].size() - ans1.size();
printf("%.2f%%\n", nc / nt * 100.0);
}
return 0;
}
/*
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
*/