天梯赛练习——7-41 集合相似度 (25分)(set集合)
程序员文章站
2022-06-07 21:45:04
...
题目:
分析:
此题使用set来做,对于每一个输入的元素,将其插入到所属的set集合中,因为set保证了元素的不重复性,所以最后两个集合一共有的不相等整数的个数等于:集合1的元素个数 + 集合2的元素个数 - 两个集合共有的元素个数。两个集合共有的元素的查找:遍历一个集合中的每个元素,使用 find 方法查找另一个集合中是否存在此元素。最后相除即可得出答案。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <set>
using namespace std;
set<int> num[55];
int n,m,k;
int main()
{
int val;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&m);
for(int j=1;j<=m;++j)
{
scanf("%d",&val);
num[i].insert(val);
}
}
scanf("%d",&k);
int x1,x2;
for(int i=1;i<=k;++i)
{
scanf("%d%d",&x1,&x2);
int ans = 0;
set<int>::iterator iter;
for(iter=num[x1].begin();iter!=num[x1].end();++iter)
if(num[x2].find(*iter) != num[x2].end())
ans++;
double res = 1.0*ans / (num[x1].size()+num[x2].size()-ans);
res = res*100;
printf("%.2f%%\n",res);
}
return 0;
}