Given two sets of integers, the similarity of the sets is defined to be Nc/Nt×100%, where Nc is the number of distinct common numbers shared by the two sets, and Nt is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.
Input Specification:
Each input file contains one test case. Each case first gives a positive integer N (≤50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (≤104) and followed by M integers in the range [0,109]. After the input of sets, a positive integer K (≤2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.
Output Specification:
For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.
Sample Input:
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3
Sample Output:
50.0%
33.3%
题意:有3个集合,其编号从1开始,第一个集合有三个元素,分别是99,87,101...有两个要处理的集合,下面列出,1,2是要对比的集合,就要输出要集合1和集合2的交集元素个数和并集元素个数;
思路:因为有些样例有重复,用set去重,用其中一个set的find函数找另一个set的值,找得到就n++,说明有一个交集,找到交集并集也就知道了,我们知道交集的补集是并集,所有就有set1和se2的元素和-交集元素即可得到并集元素;
学习总结:
set:
1.set存放元素用insert;
2.set.find()找不到返回迭代器end(),找得到就返回找到元素的迭代器;
3.set的遍历只能用迭代器
set<int >::iterator it=s.begin();it!=s.end();it++)
代码:
#include<iostream>
#include<set>
using namespace std;
const int maxn=60;
set<int > s[maxn];
void compare(int a,int b){
int n=0,m=0;
for(set<int >::iterator it=s[a].begin();it!=s[a].end();it++){//set只能用迭代器访问;
if(s[b].find(*it)!=s[b].end()){
n++;//交集数++;
}
}
m=s[a].size()+s[b].size()-n;
printf("%.1lf\%\n",n*100.0/m);
}
int main(){
int n,m,num,comnum,num1,num2;
cin>>n;//n个集合;
for(int i=1;i<=n;i++){
cin>>m;//一个集合里面的元素个数:
for(int j=1;j<=m;j++){
cin>>num;//集合的元素;
s[i].insert(num);//在集合i插入元素;
}
}
cin>>comnum;//要对比的集合组数;
for(int i=0;i<comnum;i++){
cin>>num1>>num2;
compare(num1,num2);
}
return 0;
}