解题思路:
本质上是求交集与并集大小的比值。
题目要求每个集合实际上是没有重复元素的,所以第一步,对每个集合进行去重。
找相同元素时,只要合并两个集合并且去重(unique函数去重会把重复元素放在最后,可以以此找到重复元素)求出百分比即可。
代码如下:
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 50+1;
vector<int> sets[maxn];
int pos[maxn];
int main()
{
int n, q;
while(scanf("%d", &n) == 1)
{
for(int i = 1; i <= n; i++)
{
int num, x;
scanf("%d", &num);
for(int j = 0; j < num; j++)
{
scanf("%d", &x);
sets[i].push_back(x);
}
sort(sets[i].begin(), sets[i].end());
pos[i] = unique(sets[i].begin(), sets[i].end()) - sets[i].begin(); //记住非重复的位置
}
scanf("%d", &q);
for(int i = 0; i < q; i++)
{
int u, v;
scanf("%d%d", &u, &v);
vector<int> now;
for(int j = 0; j < pos[u]; j++) now.push_back(sets[u][j]);
for(int j = 0; j < pos[v]; j++) now.push_back(sets[v][j]); //合并集合
sort(now.begin(), now.end());
int c = unique(now.begin(), now.end()) - now.begin(); //把重复的放后面
printf("%.1f%%\n", double(now.size()-c)/c * 100.0); //c后面的都是重复元素
}
}
return 0;
}