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

是我第二次使用set,這個容器很好用,鍵值一體(就是只能存一個值),自動排序,還不讓重復(fù)。
集合相似度這題,與set契合度很高。我也在解題過程中掌握了一些set的用法。
明天就是天梯賽了,加油鴨。

題目鏈接:
https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608

題意描述:
?? “分子是兩個集合都有的不相等整數(shù)的個數(shù),分母是兩個集合一共有的不相等整數(shù)的個數(shù)。”
簡單說,不考慮數(shù)字出現(xiàn)的次數(shù),倆集合的交集的元素數(shù)目,除以倆集合的并集的元素數(shù)目。
完了注意一下輸出%%就行。

解題思路:
因為n<=50,所以可以先建個set<int>s[n+1],把每個集合內(nèi)容去重,存下來。再建個迭代器,根據(jù)輸入的集合編號,循環(huán)遍歷集合1,看看能不能在集合2里找到一樣的,如果找到了:same+=1;否則dif+=1;最后得到的分數(shù)是 same/(diff+s[b].size()),處理輸出。
這里的same記錄交集元素數(shù)目,diff+s[b].size()是1中與2不同的元素數(shù)目加上集合2的元素總數(shù),也就是并集元素總數(shù)。

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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容