
L2-005 集合相似度 - 团体程序设计天梯赛-练习集
代码实现(C++)
#include <iostream>
#include <vector>
#include <unordered_set>
#include <iomanip>
// 计算两个集合的相似度
double cal(const std::unordered_set<int>& set_a, const std::unordered_set<int>& set_b) {
int num_shared = 0;
// 遍历较小的集合,减少查找次数
if (set_a.size() < set_b.size()) {
for (int num : set_a) {
if (set_b.count(num)) {
num_shared++;
}
}
} else {
for (int num : set_b) {
if (set_a.count(num)) {
num_shared++;
}
}
}
// 计算相似度
return static_cast<double>(num_shared) / (set_a.size() + set_b.size() - num_shared) * 100;
}
int main() {
int N;
std::cin >> N;
std::vector<std::unordered_set<int>> sets(N + 1);
// 读取每个集合的元素
for (int i = 1; i <= N; i++) {
int total;
std::cin >> total;
for (int j = 0; j < total; j++) {
int cur;
std::cin >> cur;
sets[i].insert(cur);
}
}
int total_test;
std::cin >> total_test;
// 处理每个查询
for (int i = 0; i < total_test; i++) {
int a, b;
std::cin >> a >> b;
double res = cal(sets[a], sets[b]);
// 输出结果,保留两位小数
std::cout << std::fixed << std::setprecision(2) << res << "%" << std::endl;
}
return 0;
}