Given two sets of integers, the similarity of the sets is defined to be N**c/N**t×100%, where N**c is the number of distinct common numbers shared by the two sets, and N**t is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.
Input Specification:
Each input file contains one test case. Each case first gives a positive integer N (≤50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (≤104) and followed by M integers in the range [0,109]. After the input of sets, a positive integer K (≤2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.
Output Specification:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.
Sample Input:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
Sample Output:
50.0%
33.3%
思路
- 来说,题意就是求两个集合的交集的长度
/
两个集合的总长度。也就是求交集/
并集,很自然地想到要用STL中的set
容器
代码
#include<bits/stdc++.h>
using namespace std;
set<int> v[60];
int main()
{
int n;
scanf("%d", &n);
int cnt = 0;
int t;
for(int j=1;j<=n;j++) //注意集合的下标是从1开始的
{
scanf("%d", &cnt);
for(int i=0;i<cnt;i++)
{
scanf("%d", &t);
v[j].insert(t);
}
}
int query;
scanf("%d", &query);
int a, b;
for(int i=0;i<query;i++)
{
scanf("%d %d", &a, &b);
int sum = v[b].size(), equals = 0; //总数量初始化为b的大小
set<int>::iterator it;
for(it = v[a].begin(); it!=v[a].end();it++)
{
if(v[b].find(*it) != v[b].end()) //在b集合中找有无a的元素
equals++;
else sum++;
}
printf("%.1f%%
", equals * 100.0 / sum);
}
return 0;
}
引用
https://pintia.cn/problem-sets/994805342720868352/problems/994805409175420928