1063 Set Similarity (25 分)

Given two sets of integers, the similarity of the sets is defined to be /, where Nc​​ is the number of distinct common numbers shared by the two sets, and Nt​​ 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 (≤) which is the total number of sets. Then N lines follow, each gives a set with a positive M (≤) and followed by M integers in the range [0]. After the input of sets, a positive integer K (≤) 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%
 
 思路:挺麻烦的一个题,充分利用了vector和set,
注意:
利用map给第一行数据打标记,然后再去遍历第二行数据判断是否为交集元素,这样子只是将两行数据都只遍历了一遍,会超时
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
#define eps 1e-8
#define  inf  0x3fffffff
vector<set<int> > ve;
int main(){
    int n,m;
    scanf("%d",&n);
    ve.resize(n);
    int temp;
    for(int i=0;i<n;i++){
        scanf("%d",&m);
        for(int j=0;j<m;j++){
            scanf("%d",&temp);
            ve[i].insert(temp);
        }
    }
    int k,a,b;
    scanf("%d",&k);
    for(int i=0;i<k;i++){
        set<int> s,st;
        scanf("%d %d",&a,&b);
        int sum=ve[a-1].size()+ve[b-1].size();
        for(set<int>::iterator it=ve[a-1].begin();it!=ve[a-1].end();it++){
            if(ve[b-1].find(*it)!=ve[b-1].end()){
                st.insert(*it);
            }
        }
        
        printf("%.1f%\n",st.size()*100.0/(sum-st.size()));
    }
    return 0;
}

 

posted @ 2021-06-28 22:55  XA科研  阅读(27)  评论(0编辑  收藏  举报