PAT-A1063. Set Similarity

/**************************
//@Author: 3stone
//@ACM: PAT-A1063
//@Time: 18/1/24
//@IDE: VS2017
***************************/
#include<cstdio>
#include<iostream>
#include<set>
#include<iterator>

using namespace std;

int main() {
    set<int> data[60], interSet, unionSet;
    int n, m, k, temp, qr_1, qr_2;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> m;
        while (m-- > 0) {
            cin >> temp;
            data[i].insert(temp);
        }   
    }
    cin >> k;
    for (int i = 0; i < k; i++) {
        cin >> qr_1 >> qr_2;
        //对比qr_1 qr_2的元素
        int interNum = 0, unionNum = data[qr_1].size() + data[qr_2].size();
        for (set<int>::iterator it = data[qr_1].begin(); it != data[qr_1].end(); it++) {
            if (data[qr_2].find(*it) != data[qr_2].end()) {
                interNum++;
                unionNum--;
            }
        }
    //直接用union和intersection虽然代码简单,但其实要复制粘贴所有set中的元素,会导致一组测试点超时
    //  interSet.clear();
    //  unionSet.clear();
    //  set_intersection(data[qr_1].begin(), data[qr_1].end(), data[qr_2].begin(), data[qr_2].end(), inserter(interSet, interSet.begin()));
    //  set_union(data[qr_1].begin(), data[qr_1].end(), data[qr_2].begin(), data[qr_2].end(), inserter(unionSet, unionSet.begin()));
    //  double query = (double)interSet.size() / unionSet.size();
        double query = (double)interNum / unionNum;
        query *= 100;
        printf("%.1f%%\n", query);
    }

    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_26398495/article/details/79155771