1063 Set Similarity

题意:求两个集合的相似性。

思路:考察set。会用set题目就很简单。不过这里要拓展一下,求交集求并集的函数。见最后。

代码:

#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

int main()
{
    freopen("pat.txt","r",stdin);
    int n,m,val;
    scanf("%d",&n);
    vector<set<int>> st(n+1);
    for(int i=1;i<=n;i++){
        scanf("%d",&m);
        while(m--){
            scanf("%d",&val);
            st[i].insert(val);
        }
    }
    int q,u,v;
    scanf("%d",&q);
    while(q--){
        scanf("%d%d",&u,&v);
        set<int> set_u=st[u];
        set<int> set_v=st[v];
        int nc=0;
        for(auto i:set_u)
            if(set_v.find(i)!=set_v.end()) nc++;
        double rate=100*(double)nc/(set_u.size()+set_v.size()-nc);
        printf("%.1f\%\n",rate);//输出%要加个转义字符"\"
    }
    return 0;
}
 
STL中有求两个集合的函数,在头文件<algorithm>(这里的"集合"不一定非得是set,也可以是vector,string等,但是前提是有序),set_intersection,set_union,用法如下:
#include <cstdio>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

int main()
{
    set<int> a={1,2,3};
    set<int> b={3,4,1};
    set<int> jiaoji,bingji;//蜜汁命名~

    set_intersection(a.begin(),a.end(),b.begin(),b.end(),inserter(jiaoji,jiaoji.begin()));//注意最后一个参数的写法
    for(auto i:jiaoji) printf("%d ",i);//输出1 3
    printf("\n");
    set_union(a.begin(),a.end(),b.begin(),b.end(),inserter(bingji,bingji.begin()));
    for(auto i:bingji) printf("%d ",i);//输出1 2 3 4
    printf("\n");

    vector<int> u={1,3,2,4};
    vector<int> v={4,2,3,5};
    vector<int> vecJiao,vecBing;
    //要先确保容器里元素是有序的,还必须是升序的,若不是有序的或升序的,程序也能运行,但结果不是如我们想的那样的!
    sort(u.begin(),u.end());
    sort(v.begin(),v.end());
    
    set_intersection(u.begin(),u.end(),v.begin(),v.end(),inserter(vecJiao,vecJiao.begin()));
    for(auto i:vecJiao) printf("%d ",i);//输出2 3 4
    printf("\n");
    set_union(u.begin(),u.end(),v.begin(),v.end(),inserter(vecBing,vecBing.begin()));
    for(auto i:vecBing) printf("%d ",i);//输出1 2 3 4 5
    printf("\n");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/kkmjy/p/9562631.html