天梯赛--集合相似度

来源:互联网 发布:淘宝开店做代理 编辑:程序博客网 时间:2024/06/04 23:25
集合相似度   (25分)

给定两个整数集合,它们的相似度定义为:N_c / N_t \times 100\%Nc/Nt×100%。其中N_cNc是两个集合都有的不相等整数的个数,N_tNt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入格式:

输入第一行给出一个正整数NN\le 5050),是集合的个数。随后NN行,每行对应一个集合。每个集合首先给出一个正整数MM\le 10^4104),是集合中元素的个数;然后跟MM[0, 10^9][0,109]区间内的整数。

之后一行给出一个正整数KK\le 20002000),随后KK行,每行对应一对需要计算相似度的集合的编号(集合从1到NN编号)。数字间以空格分隔。

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:

33 99 87 1014 87 101 5 877 99 101 18 5 135 18 9921 21 3

输出样例:

50.00%

33.33%

#include <iostream>#include <cstdio>#include <cmath>#include <queue>#include <stack>#include <map>#include <algorithm>#include <vector>#include <string>#include <cstring>#include <sstream>using namespace std;int cnt[55];int a[55][10005];map<int,int> vis[55];double judge(int p,int q){    int i=0;    int j=0;    int fenzi=0;    while(i<cnt[p]&&j<cnt[q])    {        if(a[p][i]==a[q][j])        {            i++;            j++;            fenzi++;        }        else if(a[p][i]>a[q][j])        {            j++;        }        else if(a[p][i]<a[q][j])        {            i++;        }    }    int fenmu=cnt[p]+cnt[q]-fenzi;    double ans=fenzi*1.0/fenmu;    return ans;}int main(){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)    {        int m;        vis[i].clear();        scanf("%d",&m);        int x;        for(int j=0;j<m;j++)        {            scanf("%d",&x);            if(vis[i][x]==0)            {                vis[i][x]=1;                a[i][cnt[i]++]=x;            }        }        sort(a[i],a[i]+cnt[i]);    }    int k;    scanf("%d",&k);    while(k--)    {        int p,q;        scanf("%d%d",&p,&q);        p--;        q--;        double ans=judge(p,q);        printf("%.2f%%\n",ans*100);    }    return 0;}


0 0
原创粉丝点击