https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608
思路:利用
s
e
t
set
set去重,计算的时候暴力即可,当然也可以利用
m
a
p
map
map。
s
e
t
+
m
a
p
:
set+map:
set+map:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
using ll=long long;
set<int> s[55];
map<int,bool> m;
int main()
{
int n,t,k;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
int v;
while(t--)
{
scanf("%d",&v);
s[i].insert(v);
}
}
scanf("%d",&k);
while(k--)
{
int u,v,ct1=0,ct2=0;
m.clear();
scanf("%d%d",&u,&v);
--u,--v;
if(s[u].size()>s[v].size())
swap(u,v);
for(int num:s[u])
m[num]=true;
for(int num:s[v])
{
if(m.find(num)!=m.end())
++ct1;
else
++ct2;
}
printf("%.2f%%\n",ct1*1.0/(ct2+m.size())*100);
}
return 0;
}
s e t : set: set:
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
using ll=long long;
set<int> s[55];
int main()
{
int n,t,k;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&t);
int v;
while(t--)
{
scanf("%d",&v);
s[i].insert(v);
}
}
scanf("%d",&k);
while(k--)
{
int u,v,ct=0;
scanf("%d%d",&u,&v);
--u,--v;
if(s[u].size()>s[v].size())
swap(u,v);
for(int num:s[u])
{
if(s[v].find(num)!=s[v].end())
++ct;
}
printf("%.2f%%\n",ct*1.0/(s[u].size()+s[v].size()-ct)*100);
}
return 0;
}