[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

全部评论

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
09-23 16:24
河海大学 C++
俺的offer在哪:至少还有感谢信,我连感谢信都没发,三面完隔天状态查询就是未通过😂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务