求两个集合交集与并集的元素个数比例

问题

1063 Set Similarity (25 分)
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 (≤10
4
) and followed by M integers in the range [0,10
9
]. 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%

思路

两个集合的并集元素个数,等于合并后set的size。而他们的交集元素个数比,等于集合1个数与集合2个数之和,减去并集元素个数。

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10010;
set<int> in[maxn];
int main(){
    
    
    int n,m,temp,s1,s2,k;
    scanf("%d",&n);
    for (int i = 1; i <= n; ++i) {
    
    
        scanf("%d",&k);
        for (int j = 0; j < k; ++j) {
    
    
            scanf("%d",&temp);
            in[i].insert(temp);
        }
    }
    scanf("%d",&m);
    for (int j = 0; j < m; ++j) {
    
    
        scanf("%d%d",&s1,&s2);
        int total = in[s1].size()+in[s2].size();
        set<int> ans;
        ans = in[s1];
        ans.insert(in[s2].begin(),in[s2].end());
        int noRe = ans.size();
        total = total - noRe;
        double ans_rate = 1.0*total/noRe;
        printf("%.1f%%",ans_rate*100);
    }
    return 0;
}

总结

需要知道合并两个set的操作,insert。注意不能直接在s1的基础上合并s2,这样s1的值会改变。

猜你喜欢

转载自blog.csdn.net/qq_19272233/article/details/119534555