• PAT天梯赛L2-005 集合相似度


    题目链接:点击打开链接

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

    输入格式:

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

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

    输出格式:

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

    输入样例:
    3
    3 99 87 101
    4 87 101 5 87
    7 99 101 18 5 135 18 99
    2
    1 2
    1 3
    
    输出样例:
    50.00%
    33.33%
    
    思路:明显是set题,直接放进set容器,注意先得到共有的, 然后  集合个数之和-共有的 就是不等的。

    AC代码:
    #include<iostream>
    #include<set>
    using namespace std;
    
    set<int> s[55];
    
    void cal(int u, int v) {
      int nc = 0;
      for(set<int> :: iterator it = s[u].begin(); it != s[u].end(); it++) {//从一个集合在另一个集合找相等的
        if(s[v].find(*it) != s[v].end())
          nc++;
      }
      int nt = s[u].size() + s[v].size() - nc;//总是不这样想,所以超时了
      printf("%.2lf%%
    ", (double)nc / nt * 100);
    }
    
    int main() {
      int n, m, x;
      cin >> n;
      for(int i = 1; i <= n; i++) {//处理数据
        scanf("%d", &m);
        for(int j = 0; j < m; j++) {
          scanf("%d", &x);
          s[i].insert(x);
        }
      } 
      int c_num, u, v;
      cin >> c_num;
      for(int i = 0; i < c_num; i++) {
        scanf("%d %d", &u, &v);
        cal(u, v);
      }
      return 0;
    }

  • 相关阅读:
    Java Web 网络留言板2 JDBC数据源 (连接池技术)
    Java Web 网络留言板3 CommonsDbUtils
    Java Web ConnectionPool (连接池技术)
    Java Web 网络留言板
    Java Web JDBC数据源
    Java Web CommonsUtils (数据库连接方法)
    Servlet 起源
    Hibernate EntityManager
    Hibernate Annotation (Hibernate 注解)
    wpf控件设计时支持(1)
  • 原文地址:https://www.cnblogs.com/ACMerszl/p/9573007.html
Copyright © 2020-2023  润新知