是我第二次使用set,这个容器很好用,键值一体(就是只能存一个值),自动排序,还不让重复。
集合相似度这题,与set契合度很高。我也在解题过程中掌握了一些set的用法。
明天就是天梯赛了,加油鸭。
题目链接:
https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608
题意描述:
“分子是两个集合都有的不相等整数的个数,分母是两个集合一共有的不相等整数的个数。”
简单说,不考虑数字出现的次数,俩集合的交集的元素数目,除以俩集合的并集的元素数目。
完了注意一下输出%%就行。
解题思路:
因为n<=50,所以可以先建个set<int>s[n+1],把每个集合内容去重,存下来。再建个迭代器,根据输入的集合编号,循环遍历集合1,看看能不能在集合2里找到一样的,如果找到了:same+=1;否则dif+=1;最后得到的分数是 same/(diff+s[b].size()),处理输出。
这里的same记录交集元素数目,diff+s[b].size()是1中与2不同的元素数目加上集合2的元素总数,也就是并集元素总数。
ac代码:
#include<stdio.h>
#include<set>
using namespace std;
int main()
{
int n,m,k;
scanf("%d",&n);
set<int>s[n+1];
int t;
for(int i=1;i<=n;i++)
{
scanf("%d",&m);
while(m--)
{
scanf("%d",&t);
s[i].insert(t);
}
}
int a,b;
scanf("%d",&k);
set<int>::iterator it;
while(k--)
{
float same=0,diff=0;
scanf("%d%d",&a,&b);
for(it=s[a].begin();it!=s[a].end();it++)
{
if(s[b].find(*it)!=s[b].end()) //如果在b里找到了a
same+=1;
else
diff+=1;
}
printf("%.2f%%\n",same/(diff+s[b].size())*100);
}
return 0;
}