集合相似度set

来源:互联网 发布:淘宝网官网登陆 编辑:程序博客网 时间:2024/05/17 05:52

set的set_intersection用法:
对两个set集合取交运算,存在一个新的set函数之中。利用了set容器的不重复的性质
集合相似度

时间限制

400 ms

内存限制

65536 kB

代码长度限制

8000 B

判题程序

Standard

作者

陈越

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

输入格式:

输入第一行给出一个正整数N(<=50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(<=104),是集合中元素的个数;然后跟M个[0, 109]区间内的整数。

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

输出格式:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。
输入样例:3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

输出样例:50.00%
33.33%

#include<iostream>#include<stdio.h>#include<algorithm>#include<set>using namespace std;int main(){  int a[50+5];  int n;  while(cin>>n)  {   set<int>v[10000+5];   int temp;    for(int i=0;i<n;i++)    {      cin>>a[i];       for(int j=0;j<a[i];j++)         {             cin>>temp;             v[i].insert(temp);         }    }    int m;    cin>>m;    while(m--)    {      set<int>vs;      int x,y;      cin>>x>>y;      x--;      y--;      set<int>::iterator it;      set_intersection(v[x].begin(),v[x].end(),v[y].begin(),v[y].end(),inserter(vs,vs.begin()));      //cout<<vs.size()<<endl;      int k=v[x].size()+v[y].size()-vs.size();     // cout<<ans<<" "<<k<<endl;      printf("%.2lf%%\n",(double)vs.size()/k*100);    }  }  return 0;}
0 0
原创粉丝点击