1063 Set Similarity (25point(s)) 需要二刷 *集合思想,一定要注意

基本思想:

自己的方法是直接用set记录,直接遍历两个一起添加得笨办法,但是示例代码中的值得学习;

关键点:

集合并集交集思想,可以直接记录第一个set得数目,直接遍历第二个;

如果在使用第一个set.find,找到相同元素,直接记录交集数目+1;找到不同元素,则交集元素+1;

double charge(int a, int b) {
    double jn=0, bn=0;
    bn = vec[a].size();
    for (auto it = vec[b].begin(); it != vec[b].end(); it++) {
        if (vec[a].find(*it) != vec[a].end()) {
            //如果找到相同元素;
            jn++;
        }
        else {
            bn++;
        }
    }
    return jn/bn;
}

总体代码:

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<vector> 
#include<string>
#include<math.h>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<set>
using namespace std;

int n,m;
vector<set<int>>vec;

double charge(int a, int b) {
    double jn=0, bn=0;
    bn = vec[a].size();
    for (auto it = vec[b].begin(); it != vec[b].end(); it++) {
        if (vec[a].find(*it) != vec[a].end()) {
            //如果找到相同元素;
            jn++;
        }
        else {
            bn++;
        }
    }
    return jn/bn;
}

int main() {
    scanf("%d", &n);
    int a,b;
    for (int i = 0; i < n; i++) {
        set<int>s;
        scanf("%d", &a);
        for (int j = 0; j < a; j++) {
            scanf("%d", &b);
            s.insert(b);
        }
        vec.push_back(s);
    }
    scanf("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf("%d %d", &a, &b);
        double re = charge(a - 1, b - 1)*100;
        //cout << re << endl;
        printf("%.1lf%%\n", re);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/songlinxuan/p/12340726.html