思想是用set。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <algorithm>
using namespace std;
#define MAX 50+5
set<int> sets[MAX];
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int N;
scanf("%d", &N);
for(int i = 1; i <= N; i++)
{
int n = 0;
scanf("%d", &n);
while (n--)
{
int t = 0;
scanf("%d", &t);
sets[i].insert(t);
}
}
int K = 0;
scanf("%d", &K);
while (K--)
{
int a = 0 ,b = 0;
set<int> t;
scanf("%d %d", &a, &b);
for (set<int>::iterator it = sets[a].begin(); it != sets[a].end(); it++)
{
t.insert(*it);
}
for (set<int>::iterator it = sets[b].begin(); it != sets[b].end(); it++)
{
t.insert(*it);
}
printf("%.1lf%%\n", (sets[a].size()+sets[b].size()-t.size())*100.0/t.size());
}
return 0;
}
///
上一个超时
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <algorithm>
using namespace std;
#define MAX 50+5
set<int> sets[MAX];
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int N;
scanf("%d", &N);
for(int i = 1; i <= N; i++)
{
int n = 0;
scanf("%d", &n);
while (n--)
{
int t = 0;
scanf("%d", &t);
sets[i].insert(t);
}
}
int K = 0;
scanf("%d", &K);
while (K--)
{
int a = 0 ,b = 0;
set<int> t;
scanf("%d %d", &a, &b);
int totalnum = sets[a].size(), samenum = 0;
for (set<int>::iterator it = sets[b].begin(); it != sets[b].end(); it++)
{
if (sets[a].find(*it) != sets[a].end())
samenum++;
else
totalnum++;
}
printf("%.1lf%%\n", samenum*100.0/totalnum);
}
return 0;
}