PAT 1063 Set Similarity (25 分)

1063 Set Similarity (25 分)

Given two sets of integers, the similarity of the sets is defined to be N c N_c / N t N_t ×100%, where N c N_c is the number of distinct common numbers shared by the two sets, and N t 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 (≤ 1 0 4 10^4 ) and followed by M integers in the range [0, 1 0 9 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%




解析

N c N_c 是两个集合的交集元素数量。
N t N_t 是两个集合的并集元素数量。

#include<unordered_set>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	int N, K;
	scanf("%d", &N);
	vector<unordered_set<int>> data(N + 1);
	for (int i = 0; i < N; i++) {
		int M, t;
		scanf("%d", &M);
		while (M--) {
			scanf("%d", &t);
			data[i + 1].insert(t);
		}
	}
	scanf("%d", &K);
	for (int i = 0; i < K; i++) {
		int data1, data2;
		scanf("%d %d", &data1, &data2);
		int Nc = 0, Nt = data[data2].size();
		for (auto x : data[data1]) {
			if (data[data2].find(x) == data[data2].end())
				Nt++;
			else
				Nc++;
		}
		printf("%.1f%%\n", static_cast<double>(Nc) / Nt * 100);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_41256413/article/details/84027902