团体程序设计天梯赛PTA L2-005集合相似度

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

题意:Nc就是两个集合中共同都出现数的个数,Nt为一共有几个不一样的数(这道题先考了语文...)然后一除算出百分形式得出答案

思路:用set容器进行模拟,把各组数分别装进set容器中,减去了查重的步骤。再用count函数判断两个数组重复出现的数的个数可以大大缩短时间。

(别莽,暴力会出事...最后一个例子卡暴力

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<string>
 5 #include<string.h>
 6 #include<set>
 7 #include<vector>
 8 #include<map>
 9 using namespace std;
10 
11 const int N = 1e4 + 10;
12 set<int>::iterator itt;
13 set<int> s[55];//将数组都存在set容器里
14 
15 void init()//初始化
16 {
17     for(int i = 0; i < 55; i ++)
18     {
19         s[i].clear();
20     }
21 }
22 int main()
23 {
24     int n, k, c, t, a, b;
25     scanf("%d",&n);
26     init();
27     //输入
28     for(int i = 1; i <= n; i ++)
29     {
30         scanf("%d",&a);
31         for(int j = 1; j <= a; j ++)
32         {
33             scanf("%d",&b);
34             s[i].insert(b);
35         }
36     }
37     scanf("%d",&k);
38     int f1,f2;
39     for(int i = 1; i <= k; i ++)
40     {
41         c = 0;//分子
42         t = 0;//分母
43         scanf("%d%d",&f1,&f2);
44 
45         for(itt = s[f2].begin(); itt != s[f2].end(); itt ++)
46         {
47             //点睛之笔!!!qaq菜鸡本人并没有自己想出来,这一步缩短很多时间
48             //如果在一个容器里找另外一个数的次数为1的话就在分子加1
49             if(s[f1].count(*itt))
50             {
51                 c++;
52             }
53 
54         }
55         //分母就是两个set容量再减去重合的部分
56         t = s[f1].size() + s[f2].size() - c;
57         printf("%.2lf%%
",c/(double)t*100);
58 
59     }
60     return 0;
61 }
原文地址:https://www.cnblogs.com/dark-ming/p/13726603.html