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)