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 Nlines 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%

首先附上代码: 

#include "cstdio"

#include "cstring"

#include "set"

using namespace std;

int main(){

    int n;

    scanf("%d",&n);

    set<int> s[n];

    for (int i=0; i<n; i++) {

        int m;

        scanf("%d",&m);

        for (int j=0; j<m; j++) {

            int current;

            scanf("%d",&current);

            s[i].insert(current);

        }

    }

    int k;

    scanf("%d",&k);

    for (int i=0; i<k; i++) {

        int x,y;

        scanf("%d %d",&x,&y);

        set<int>::iterator t1,t2;

        double Nc=0,Nt=0;

        for (t1=s[x-1].begin(),t2=s[y-1].begin(); t1!=s[x-1].end()&&t2!=s[y-1].end();) {

            //printf(" -%d-%d- ",*t1,*t2);

            if (*t1==*t2) {     //相当则分子加1,同时后移一个继续比较

                Nc++;

                t1++;

                t2++;

            }

            else if(*t1<*t2){

                Nt++;

                t1++;

            }

            else{

                Nt++;

                t2++;

            }

        }

        if (t2!=s[y-1].end()) {     //t2更长

            while (t2!=s[y-1].end()) {

                Nt++;

                t2++;

            }

        }

        else if(t1!=s[x-1].end()){

            while (t1!=s[x-1].end()) { //t1更长

                Nt++;

                t1++;

            }

        }

        printf("%.1f%%\n",Nc/(Nt+Nc)*100);

    }}

反思:

没什么难点,主要就是set的用法,要记住set是自动升序排列的,自动去重的,添加用insert()

发布了14 篇原创文章 · 获赞 0 · 访问量 144

猜你喜欢

转载自blog.csdn.net/Yanhaoming1999/article/details/102749753