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