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%
题意:给定N个数组,每个数组中的元素不一样(需要去重),求他们两两之间交集和并集的比率,结果保留一位小数;
思路:因为题目明确要求去重,所以在这里我们使用stl中的set直接去重。在1个set中寻找是否有与之相同的元素,用到了两个函数,一个是count(x):统计x元素个数,如果个数为0说明set中没有这个元素;另一个是find(x):返回元素值为x的迭代器,如果为空说明没有元素值为x的迭代器;最后输出要注意整型与浮点型的转换(*100.0)强制转换;
AC代码
#include<stdio.h>
#include<set>
using namespace std;
set<int>st[60];
void compare(int x,int y){
int num=st[y].size();
int same=0;
for(set<int>::iterator it=st[x].begin();it!=st[x].end();it++){
if(st[y].count(*it)==1)same++; //if(st[y].find(*it)!=st[y].end())same++;
else num++;
}
printf("%.1f%\n",same*100.0/num);
}
int main(){
int n,q,s,d;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int m;
scanf("%d",&m);
for(int j=1;j<=m;j++){
int temp;
scanf("%d",&temp);
st[i].insert(temp);
}
}
scanf("%d",&q);
for(int i=0;i<q;i++){
scanf("%d%d",&s,&d);
compare(s,d);
}
return 0;
}