L2-5 集合相似度 (set的应用)

Posted fatcatm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了L2-5 集合相似度 (set的应用)相关的知识,希望对你有一定的参考价值。

给定两个整数集合,它们的相似度定义为: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%

解题思路:运用STL自带的set解决

 1 #include<cstdio>
 2 #include<set>
 3 using namespace std;
 4 
 5 int main(void)
 6 {
 7     set<int> s[55];
 8     int n;
 9     scanf("%d", &n);
10     for(int i = 1; i <= n; i++){
11         int m;
12         scanf("%d", &m);
13         for(int j = 0; j < m; j++){
14             int x;
15             scanf("%d", &x);
16             s[i].insert(x);
17         }
18     }
19     
20     int k;
21     scanf("%d", &k);
22     for(int i = 0; i < k; i++){
23         int a, b;
24         scanf("%d %d", &a, &b);
25         int sum = s[a].size() + s[b].size();
26         set<int>::iterator it;
27         int same = 0;
28         for(it = s[a].begin(); it != s[a].end(); it++){
29             if(s[b].count(*it) == 1){
30                 same++; sum--;
31             }
32         }
33         double re = (double)same / (double)sum;
34         re *= 100;
35         printf("%.2lf%\n", re);
36     }
37     
38     return 0;
39 }

 

以上是关于L2-5 集合相似度 (set的应用)的主要内容,如果未能解决你的问题,请参考以下文章

集合相似度-easy-stl-set

L2-005 集合相似度(STL+暴力)

天梯杯 L2-005. 集合相似度

天梯程序设计竞赛 L2-005. 集合相似度 STL

PAT甲题题解-1063. Set Similarity (25)-set的使用

关于集合的相似度测量方法