1. 程式人生 > 其它 >1063 Set Similarity (25 分)(set)

1063 Set Similarity (25 分)(set)

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%

題目大意:

給定兩個整數集合,它們的相似度定義為:Nc/Nt*100%。其中Nc是兩個集合都有的不相等整數的個數,Nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度
nc是兩個集合的公共元素個數,nt是兩個集合的所有包含的元素個數(其中元素個數表示各個元素之間互不相同)

分析:

因為給出的集合裡面含有重複的元素,而計算nc和nt不需要考慮兩個集合裡面是否分別有重複的元素,所以可以直接使用set儲存每一個集合,然後把set放進一個數組裡面儲存。當需要計算集合a和集合b的相似度nc和nt的時候,遍歷集合a中的每一個元素,尋找集合b中是否有該元素,如果有,說明是兩個人公共的集合元素,則nc++,否則nt++(nt的初值為b集合裡面本有的元素)

原文連結:https://blog.csdn.net/liuchuo/article/details/52138993

題解

#include <bits/stdc++.h>

using namespace std;

int main()
{
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif
    int n;
    cin>>n;
    set<int> a[n+1];
    for(int i=1;i<=n;i++){
        int k,tmp;
        cin>>k;
        for(int j=0;j<k;j++){
            cin>>tmp;
            a[i].insert(tmp);
        }
    }
    int t,x,y;
    cin>>t;
    for(int i=0;i<t;i++){
        cin>>x>>y;
        int nc=0,nt=a[y].size();
        for(auto it=a[x].begin();it!=a[x].end();it++){
            if(a[y].find(*it)==a[y].end()) nt++;
            else nc++;
        }
        printf("%.1f%%\n",(double)nc/nt*100);
    }
    return 0;
}

本文來自部落格園,作者:勇往直前的力量,轉載請註明原文連結:https://www.cnblogs.com/moonlight1999/p/15607210.html