给定两个整数集合,它们的相似度定义为:/。其中Nc是两个集合都有的不相等整数的个数,Nt是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。
输入格式:
输入第一行给出一个正整数N(≤),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤),是集合中元素的个数;然后跟M个[区间内的整数。
之后一行给出一个正整数K(≤),随后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%
本题利用了,set存数,set的优点是不会存相同的数,因此两个set里的数的数量的和就是一共不相等的整数的个数,之后遍历求相同的数如果有的话,nc++,最后要去掉相同的数。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<algorithm> 7 #include<set> 8 using namespace std; 9 set<int> v[55]; 10 void solve(int x,int y) 11 { 12 int nc=0,nt=0; 13 set<int>::iterator it; 14 nt=v[x].size()+v[y].size(); 15 for(it=v[x].begin();it!=v[x].end();it++) 16 { 17 if(v[y].find(*it)!=v[y].end()) nc++; 18 } 19 nt-=nc; 20 printf("%.2f\%\n",nc*100.0/nt); 21 } 22 int main() 23 { 24 int n,k,t,x,y; 25 cin>>n; 26 for(int i=1;i<=n;i++) 27 { 28 cin>>t; 29 for(int j=1;j<=t;j++) 30 { 31 cin>>x; 32 v[i].insert(x); 33 } 34 } 35 cin>>k; 36 while(k--) 37 { 38 cin>>x>>y; 39 solve(x,y); 40 } 41 return 0; 42 }