PAT 1063 Set Similarity[比较]

1063 Set Similarity (25 分)

Given two sets of integers, the similarity of the sets is defined to be Nc​​/Nt​​×100%, 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 (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%

 题目大意:给出N个集合,并且给出查询,Nc表示两个集合中互异的相同的数的个数,Nt表示两个集合中不同的数的总数。求出二者的比例。

//我一看,这数据量太大了吧,不能蛮干,复杂度太高了。肯定是使用集合,但是怎么使用呢?我心里没有底。毕竟复杂度太高了。

//看了柳神的代码才恍然大悟,我是笨死了。

2018-11-18更————

又做了一遍AC了:

#include <iostream>
#include <set>
#include <cstdio>
using namespace std;

set<int> st[51];
int main() {
    int n,m,t;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>m;
        for(int j=0;j<m;j++){
            cin>>t;
            st[i+1].insert(t);
        }
    }
    cin>>m;
    int s1,s2;
    for(int i=0;i<m;i++){
        cin>>s1>>s2;
        int nc=0,nt=0;
        //cout<<st[s1].size()<<" "<<st[s2].size()<<'
';
        for(auto it=st[s1].begin();it!=st[s1].end();it++){
//            if(st[s2].find(*it)!=0){
//                nc++;
//            }
                if(st[s2].find(*it)!=st[s2].end()){
                    nc++;
                }
        }
//        set<int> s;
//        s.insert(st[s1]);
//        s.insert(st[s2]);
//        nt=s.size();
        nt=st[s1].size()+st[s2].size()-nc;
        printf("%.1f%
",1.0*nc/nt*100);
    }

    return 0;
}

1.其中在写set的find函数时,一直不行,不能判==0或者1,而是set.end()才对。学习了。

原文地址:https://www.cnblogs.com/BlueBlueSea/p/9952924.html