[PAT解题报告] Set Similarity

简单题,集合求交。正规做法是用数组存好,排好顺序,用O(n)的归并方法求交。
我直接用了C++ STL的set存了所有的集合,求交就不用排序了,用iterator迭代就可以了。求交的方法就是哪个iterator对应的数小,就移动哪个,如果相等就找到了一个相交的元素。当然还要算一下并集元素的个数,因为要算相似度,用交集元素个数除以并集元素个数。
#include <set>
#include <cstdio>

using namespace std;

set<int> a[52];

double give(int x,int y) {
int inter = 0, total = 0;
    for (set<int>::iterator t1 = a[x].begin(), t2 = a[y].begin(); (t1 != a[x].end()) ||  (t2 != a[y].end()); ++total) {
        if (t1 == a[x].end()) {
            ++t2;
        }
        else if (t2 == a[y].end()) {
            ++t1;
        }
        else if (*t1 == *t2) {
            ++inter;
            ++t1;
            ++t2;
        }
        else if (*t1 < *t2) {
            ++t1;
        }
        else {
            ++t2;
        }
    }
    return inter * 100.0 / total;
}

int main() {
int n;
    scanf("%d",&n);
    for (int i = 0; i < n; ++i) {
        int x;
        for (scanf("%d",&x);x;--x) {
            int y;
            scanf("%d",&y);
            a[i].insert(y);
        }
    }
    int m;
    for (scanf("%d",&m);m;--m) {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%.1lf%%\n", give(x - 1,y - 1));
    }
    return 0;
}



原题链接: http://www.patest.cn/contests/pat-a-practise/1063

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务