L2-005 集合相似度

#include <iostream> // 输入输出库
#include <unordered_set> // 使用哈希表存储集合
#include <iomanip> // 用于格式化输出
#include <vector> // 用于存储集合
using namespace std; // 使用标准命名空间

int main() {
    int N; // 集合的个数
    cin >> N; // 读取集合的个数

    // 存储所有集合
    vector<unordered_set<int>> sets(N + 1); // 集合编号从1到N

    // 读取每个集合
    for (int i = 1; i <= N; i++) {
        int M; // 集合中元素的数量
        cin >> M; // 读取集合中元素的数量
        for (int j = 0; j < M; j++) {
            int element; // 集合中的元素
            cin >> element; // 读取元素
            sets[i].insert(element); // 将元素插入集合,unordered_set自动去重
        }
    }

    int K; // 需要计算相似度的集合对数
    cin >> K; // 读取集合对数

    // 计算每对集合的相似度
    for (int i = 0; i < K; i++) {
        int set1, set2; // 需要计算相似度的两个集合的编号
        cin >> set1 >> set2; // 读取集合编号

        // 计算交集大小
        int Nc = 0;
        // 遍历较小的集合
        const unordered_set<int>& smallerSet = (sets[set1].size() < sets[set2].size()) ? sets[set1] : sets[set2];
        const unordered_set<int>& largerSet = (sets[set1].size() < sets[set2].size()) ? sets[set2] : sets[set1];
        for (int element : smallerSet) {
            if (largerSet.count(element)) {
                Nc++; // 如果在,则交集大小加1
            }
        }

        // 计算并集大小
        int Nt = sets[set1].size() + sets[set2].size() - Nc;

        // 计算相似度
        double similarity = (Nc == 0) ? 0.0 : (double)Nc / Nt * 100;

        // 输出结果,保留两位小数
        cout << fixed << setprecision(2) << similarity << "%" << endl;
    }

    return 0; // 程序正常结束
}

for (int element : smallerSet) 是 C++11 引入的范围 for 循环(Range-based for loop),用于遍历容器(如 unordered_set)中的所有元素.

vector<unordered_set<int>> sets(N + 1);:

使用 vector 存储所有集合,每个集合是一个 unordered_set<int>。

unordered_set 是基于哈希表的集合,插入和查找的时间复杂度为 O(1)。

集合编号从1到N,因此 vector 的大小为 N + 1。

全部评论

相关推荐

白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
投了多少份简历才上岸
点赞 评论 收藏
分享
叶扰云倾:进度更新,现在阿里云面完3面了,感觉3面答得还行,基本都答上了,自己熟悉的地方也说的比较细致,但感觉面试官有点心不在焉不知道是不是不想要我了,求阿里收留,我直接秒到岗当阿里孝子,学校那边的房子都退租了,下学期都不回学校,全职猛猛实习半年。这种条件还不诱人吗难道 然后现在约到了字节的一面和淘天的复活赛,外加猿辅导。华为笔试完没动静。 美团那边之前投了个base广州的,把我流程卡麻了,应该是不怎么招人,我直接简历挂了,现在进了一个正常的后端流程,还在筛选,不知道还有没有hc。
点赞 评论 收藏
分享
找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务