1

题目大意:

给定N个集合,要求计算查询的2个集合的Nc/Nt的值,其中Nc指的是2集合相同元素的个数,Nt指的是2集合不同元素的个数.

算法思路:

很自然就想到用set容器来保存数据元素了,最明显的特征就distinct,要求元素不重复的个数,我们首先使用unordered_set<int> sets[55]保存每个容器的所有元素(自动去重复了),然后编写函数caculate用来计算2个集合的并集和交集元素个数,就是遍历其中一个集合然后在另外一个集合使用find函数判断是否查找成功,如果是就累计Nc,否则就累计Nt(初始为其中一个集合的元素个数),最后计算比率输出即可

注意点:

1、如果通过将2集合添加进另外一个新的集合中计算不同元素的大小,最后一个点会超时。
2、%要写成%%输出
3、这里只需要set的去重操作,所以使用unordered_set比较节省时间
4、不要使用algorithm自带的set_intersection和set_union方法,无法通过测试。

提交结果:

image.png

AC代码:

#include <cstdio>
#include <unordered_set>


using namespace std;

unordered_set<int> sets[55];//N个集合

void caculate(int first,int second){
    int Nt = sets[first].size();// first集合和second集合的并集元素总个数
    int Nc = 0;// first集合和second集合的交集元素总个数
    unordered_set<int>::iterator it;
    for(it=sets[second].begin();it!=sets[second].end();++it){
        if(sets[first].find(*it)!=sets[first].end()){
            // 在first集合中找到second集合中的元素
            ++Nc;
        } else {
            // 没有找到
            ++Nt;
        }
    }
    printf("%.1f%%\n",Nc*100.0/Nt);
}

int main(){
    int N;//集合数目
    scanf("%d",&N);
    int M;// 每一个集合的元素个数
    int num;// 集合元素
    for (int i = 1; i <= N; ++i) {
        scanf("%d",&M);
        for (int j = 0; j < M; ++j) {
            scanf("%d",&num);
            sets[i].insert(num);
        }
    }
    int K;//查询个数
    scanf("%d",&K);
    int index_first,index_second;// 查询的第一个集合和第二个集合的下标
    for (int k = 0; k < K; ++k) {
        scanf("%d %d",&index_first,&index_second);
        caculate(index_first,index_second);
    }
    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得