PATL2_005集合相似度

思路:用set存放数据 定义 set<int> s[51]   set[i]表示第i个集合的全部元素

判断a,b集合相似度:判断a中有sum个元素也在b集合中出现 集合相似度就为:sum/(a.size()+b.size()-sum)

(a.size()+b.size()-sum)为a,b两个集合所有不相同元素的个数

例如 集合a有 87 99 101  a.size()=3

集合b有5 87 87 101 由于set集合不存放重复数据 所以 b:5 87 101

通过遍历发现a中有87,101两个元素在b中出现   所以sum=2

a,b中所有不同元素个数就为3+3-2 = 4 个 分别为5 87 99 101

集合相似度就为2/4=50%

代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<set>
using namespace std;
int n,m,k;
set<int> s[51];
double f(int a,int b){
    int sum=0;
    set<int>::iterator i1;
    for(i1=s[a].begin();i1!=s[a].end();i1++){
        if(s[b].count(*i1))
            sum++;
    }
    double gl = sum*1.0/(s[a].size()+s[b].size()-sum) * 100;
    printf("%.2lf%%\n",gl);    
}
int main()
{
    cin>>n;
    int num;
    for(int i=1;i<=n;i++){
        cin>>m;
        for(int j=1;j<=m;j++){
            cin>>num;
            s[i].insert(num);
        }
    }
    int a,b;    
    cin>>k;
    for(int i=1;i<=k;i++){
        cin>>a>>b;
        f(a, b);
    }
    return 0;
}
 

扫描二维码关注公众号,回复: 5283460 查看本文章

猜你喜欢

转载自blog.csdn.net/xiaoguapi99/article/details/86761312
今日推荐