L2-005 集合相似度 (25 分)

是我第二次使用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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容