是我第二次使用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;
}