1063 Set Similarity (25分)
Given two sets of integers, the similarity of the sets is defined to be N
c
/N
t
×100%, where N
c
is the number of distinct common numbers shared by the two sets, and N
t
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 (≤10
4
) and followed by M integers in the range [0,10
9
]. 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%
#include <cstdio>
#include <set>
using namespace std;
int main(){
int n;
scanf("%d", &n);
set<int> s[n+1];
for(int i=1; i<=n; i++){
int num;
scanf("%d", &num);
for(int j=0; j<num; j++){
int ys;
scanf("%d", &ys);
s[i].insert(ys);
}
}
int bj;
int nt, nc;
int num1, num2;
scanf("%d", &bj);
for(int i=0; i<bj; i++){
scanf("%d %d", &num1, &num2);
nt = s[num2].size();
nc = 0;
for(set<int>::iterator it=s[num1].begin(); it!=s[num1].end(); it++){
if(s[num2].find(*it) != s[num2].end()){
nc++;
}else{
nt++;
}
}
printf("%.1f%\n", nc*100.0/nt);
}
return 0;
}
这题主要是题目比较难理解,我看了好久还没懂distinct common numbers和distinct numbers的区别。
理解题目后,很快就能反应过来用set来做,这题关键就是求并集和交集。
我开始的做法是把比较的两个set集合中的元素又加到一个新开的set中,这样很方便能求出并集和交集的数量,但是有一定概率会超时,我提交了10次大概有7次这样子超时,过的几次也都是卡着边界的时间。
用了书上的解法写了一遍,用find函数来查找相同或不同的元素,这样就不用多开一个set集合,能节省很多时间。