1063 Set Similarity (25 分)难度: 一般 / 知识点: STL中set的应用

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1063 Set Similarity (25 分)难度: 一般 / 知识点: STL中set的应用相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805409175420928
可以很容易的写出一个最暴力的写法。可以骗21分

#include<bits/stdc++.h>
using namespace std;
const int N=55;
vector<int>ve[N];
int n,m,k,x,a,b;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&m);
        for(int j=0;j<m;j++) scanf("%d",&x),ve[i].push_back(x);
    }
    cin>>k;
    while(k--)
    {
        scanf("%d%d",&a,&b);
        unordered_map<int,int>mp;//统计不同的数量
        unordered_map<int,int>st;//统计b中出现的
        int cnt=0;
        for(int i=0;i<ve[a].size();i++) mp[ve[a][i]]++;
        for(int i=0;i<ve[b].size();i++)
        {
            if(st[ve[b][i]]) continue;
            if(mp[ve[b][i]]) cnt++;
            mp[ve[b][i]]++;
            st[ve[b][i]]=1;
        }
        printf("%.1lf%%\\n",cnt*100.0/mp.size());
    }
    return 0;
}

用set来优化,set可以自动的去重。
unordered_set的count的平均复杂度为O(1),set的count复杂度为O(logn)

#include<bits/stdc++.h>
using namespace std;
set<int>s[55];
int n,m,k,x,a,b;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>m;
        for(int j=0;j<m;j++) scanf("%d",&x),s[i].insert(x);
    }
    cin>>k;
    while(k--)
    {
        scanf("%d%d",&a,&b);
        int cnt=0;
        for(auto i=s[a].begin();i!=s[a].end();i++) if(s[b].count(*i)) cnt++;
        printf("%.1lf%%\\n",cnt*100.0/(s[a].size()+s[b].size()-cnt));
    }
    return 0;
}

以上是关于1063 Set Similarity (25 分)难度: 一般 / 知识点: STL中set的应用的主要内容,如果未能解决你的问题,请参考以下文章

STL_A1063 Set Similarity (25 分)

PAT 甲级 1063 Set Similarity (25 分) (新学,set的使用,printf 输出%,要%%)

PAT Advanced 1063 Set Similarity (25分)(STL)

A1063 Set Similarity (25 分)

1063 Set Similarity (25 分)难度: 一般 / 知识点: STL中set的应用

PAT1063. Set Similarity (25)