天梯赛 L2-005 集合相似度
很简单的一道L2,直接使用unoredred_map记录两个数组的交集和并集即可。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define int long long
typedef long long ll;
const int N = 1010;
const int mod = 998244353;
void solve() {
int n;
cin>>n;
vector<vector<int>> a(n+1);
for(int i = 1 ; i <= n ; i++){
int m;
cin>>m;
for(int j = 1 ; j <= m ; j++){
int x;
cin>>x;
a[i].push_back(x);
}
}
int k;
cin>>k;
for(int i = 1 ; i <= k ; i++){
int x,y;
cin>>x>>y;
unordered_map<int,int> mp1,mp2;
for(int j = 0 ; j < a[x].size() ; j++){
mp1[a[x][j]]++;
}
for(int j = 0 ; j < a[y].size() ; j++){
if(mp1[a[y][j]]){ //在第一个集合中出现,就放到mp2中,mp2的长度就是交集的大小
mp2[a[y][j]]++;
}
}
int n1 = mp2.size();
for(int j = 0 ; j < a[y].size() ; j++){
mp1[a[y][j]]++;
}
int n2 = mp1.size();
double ans = n1 * 1.0 / n2 * 100.0;
printf("%.2lf%\n",ans);
}
}
signed main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int tt = 1;
// cin >> tt;
while (tt--) {
solve();
}
return 0;
}