前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【GPLT】L2-005 集合相似度

【GPLT】L2-005 集合相似度

作者头像
喜欢ctrl的cxk
发布2019-11-08 11:56:26
3930
发布2019-11-08 11:56:26
举报
文章被收录于专栏:Don的成长史

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42449444/article/details/88556720

题目描述:

给定两个整数集合,它们的相似度定义为:N​c​​/N​t​​×100%。其中N​c​​是两个集合都有的不相等整数的个数,N​t​​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。

输入描述:

输入第一行给出一个正整数N(≤50),是集合的个数。随后N行,每行对应一个集合。每个集合首先给出一个正整数M(≤10​4​​),是集合中元素的个数;然后跟M个[0,10​9​​]区间内的整数。

之后一行给出一个正整数K(≤2000),随后K行,每行对应一对需要计算相似度的集合的编号(集合从1到N编号)。数字间以空格分隔。

输出描述:

对每一对需要计算的集合,在一行中输出它们的相似度,为保留小数点后2位的百分比数字。

输入样例:

代码语言:javascript
复制
3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

输出样例:

代码语言:javascript
复制
50.00%
33.33%

解题思路:

我一开始的思路很简单粗暴,就是把每个集合中的元素放入相应的set数组中,然后无脑for-each找出俩个集合中共有的元素个数Nc,根据Nc再算出Nt,从而可以输出结果Nc/Nt*100%。可是在我提交代码之后,有个测试用例TLE了。天真的我以为只要再加上一行ios::sync_with_stdio(false);取消cin和stdin的同步之后就能够避免超时直接AC啦。然而提交之后还是TLE,问了一下学长,他说双层for循环导致的超时,求俩个set中交集可以用到一个函数叫set_intersection()。这个函数有5个参数,分别是:set1.begin(),set1.end(),set2.begin(),set2.end(),back_inserter(vector)。back_inserter()函数是iterator适配器,它能使元素被插入到作为实参的某种容器的尾部。这样就可以直接用Nc = vector.size()来代替原来的那俩层for-each语句啦,提交代码全部AC。tql!

AC代码:TLE代码:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    int N;
    cin >> N;     //集合个数
    set<int> s[N+1];
    for(int i = 1; i <= N; i++)
    {
        int M;
        cin >> M;
        for(int j = 0; j < M; j++)
        {
            int temp;
            cin >> temp;
            s[i].insert(temp);
        }
    }
    int K;
    cin >> K;
    for(int i = 0; i < K; i++)
    {
        int x,y;
        int Nc = 0;    //Nc是两个集合都有的不相等整数的个数
        cin >> x >> y;
        for(auto a : s[x])
        {
            for(auto b : s[y])
            {
                if(a == b)
                {
                    Nc++;
                }
            }
        }
        int Nt = s[x].size()+s[y].size()-Nc;  //Nt是两个集合一共有的不相等整数个数
        double temp = (double)Nc/Nt*100;
        printf("%.2f%%\n",temp);
    }
    return 0;
}

AC代码:

代码语言:javascript
复制
#include <bits/stdc++.h>
using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    int N;
    cin >> N;     //集合个数
    set<int> s[N+1];
    for(int i = 1; i <= N; i++)
    {
        int M;
        cin >> M;
        for(int j = 0; j < M; j++)
        {
            int temp;
            cin >> temp;
            s[i].insert(temp);
        }
    }
    int K;
    cin >> K;
    for(int i = 0; i < K; i++)
    {
        int x,y;
        cin >> x >> y;
        vector<int> res;
        set_intersection(s[x].begin(),s[x].end(),s[y].begin(),s[y].end(),back_inserter(res));  //set求交集
        int Nc = res.size();    //Nc是两个集合都有的不相等整数的个数
        int Nt = s[x].size()+s[y].size()-Nc;  //Nt是两个集合一共有的不相等整数个数
        double temp = (double)Nc/Nt*100;
        printf("%.2f%%\n",temp);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 输入描述:
  • 输出描述:
  • 输入样例:
  • 输出样例:
  • 解题思路:
  • AC代码:TLE代码:
  • AC代码:
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档