1063 Set Similarity(25 分)(cj)

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%

code

#pragma warning(disable:4996)
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <set>
using namespace std;
set<int> varr[55];
double deal(int a, int b);
int main(){
	int n;
	cin >> n;
	int m, x;
	for (int i = 1; i <= n; ++i) {
		cin >> m;
		while (m--) {
			cin >> x;
			varr[i].insert(x);
		}
	}
	int k;
	cin >> k;
	int a, b;
	while (k--) {
		cin >> a >> b;
		printf("%.1lf%%\n", deal(a, b) * 100);
	}
	system("pause");
	return 0;
}
double deal(int a, int b) {
	int commnum = 0;
	for (auto it = varr[a].begin(); it != varr[a].end(); ++it) {
		if (varr[b].find(*it) != varr[b].end()) ++commnum;
	}
	return double(commnum) / double(varr[a].size() + varr[b].size() - commnum);
}

猜你喜欢

转载自blog.csdn.net/Cute_jinx/article/details/82153084