1.map
find用法:
for(it1 = data[n1].begin(); it1 != data[n1].end(); it1++)
{
if(data[n2].find(it1->first) != data[n2].end())
ans += 1;
}
#include <iostream>
#include <map>
#include <cstdio>
using namespace std;
const int maxn = 1005;
map<int, int> data[maxn];
map<int, int> ::iterator it1, it2;
int main()
{
int n, m, a[maxn], k;
int x;
while(scanf("%d", &n) != -1)
{
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
for(int j = 0; j < a[i]; j++)
{
scanf("%d", &x);
data[i][x]++;
}
}
scanf("%d", &k);
int n1, n2, ans = 0;
double nx, t;
for(int i = 0; i < k; i++)
{
scanf("%d%d", &n1, &n2);
nx = data[n1].size() + data[n2].size();
for(it1 = data[n1].begin(); it1 != data[n1].end(); it1++)
{
if(data[n2].find(it1->first) != data[n2].end())
ans += 1;
}
nx -= ans;
double s1 = ans * 100;
printf("%.1f%\n", s1 / nx);
ans = 0;
}
}
return 0;
}
2.set
find用法:
for(auto it:data[n1])
{
if(data[n2].find(it) != data[n2].end())
ans += 1;
}
#include <iostream>
#include <set>
#include <cstdio>
using namespace std;
const int maxn = 1005;
set<int> data[maxn];
int main()
{
int n, m, a[maxn], k;
int x;
while(scanf("%d", &n) != -1)
{
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
for(int j = 0; j < a[i]; j++)
{
scanf("%d", &x);
data[i].insert(x);
}
}
scanf("%d", &k);
int n1, n2, ans = 0;
double nx, t;
for(int i = 0; i < k; i++)
{
scanf("%d%d", &n1, &n2);
nx = data[n1].size() + data[n2].size();
for(auto it:data[n1])
{
if(data[n2].find(it) != data[n2].end())
ans += 1;
}
nx -= ans;
double s1 = ans * 100;
printf("%.1f%\n", s1 / nx);
ans = 0;
}
}
return 0;
}