zoukankan      html  css  js  c++  java
  • 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()才对。学习了。

  • 相关阅读:
    省市区选择器
    查找算法 分享1:顺序查找
    查找算法 分享2:折半(二分)查找
    编程实现对键盘输入的英文名句子进行加密。用加密方法为,当内容为英文字母时其在26字母中的其后三个字母代替该字母,若为其它字符时不变。
    查找算法 分享3:分块查找
    NSMutableDicitionary 的setValue和setObject的区别
    查找算法 分享4:哈希查找
    玩转博客园的5个小技巧
    WCF读书笔记安全:基础知识(身份验证、授权、传输安全)
    北京的房价
  • 原文地址:https://www.cnblogs.com/BlueBlueSea/p/9952924.html
Copyright © 2011-2022 走看看