zoukankan      html  css  js  c++  java
  • 1063 Set Similarity (25)

    Given two sets of integers, the similarity of the sets is defined to be N~c~/N~t~*100%, where N~c~ is the number of distinct common numbers shared by the two sets, and N~t~ is the total number of distinct numbers in the two sets. Your job is to calculate the similarity of any given pair of sets.

    Input Specification:

    Each input file contains one test case. Each case first gives a positive integer N (<=50) which is the total number of sets. Then N lines follow, each gives a set with a positive M (<=10^4^) and followed by M integers in the range [0, 10^9^]. After the input of sets, a positive integer K (<=2000) is given, followed by K lines of queries. Each query gives a pair of set numbers (the sets are numbered from 1 to N). All the numbers in a line are separated by a space.

    Output Specification:

    For each query, print in one line the similarity of the sets, in the percentage form accurate up to 1 decimal place.

    Sample Input:

    3
    3 99 87 101
    4 87 101 5 87
    7 99 101 18 5 135 18 99
    2
    1 2
    1 3
    

    Sample Output:

    50.0%
    33.3%

    这种方法有一个测试点不能通过,原因是建立map的开销比较大,并且再查询的时候,会反复的建立map,是一个很耗费时间的过程,应该在输出数据的时候就为每一组数据建立map,这样能避免之后重复建立map;
    在编程中应该避免重复没有必要的操作
     1 #include<iostream>
     2 #include<vector>
     3 #include<map>
     4 #include<set>
     5 using namespace std;
     6 int main(){
     7   int n, m, i, j;
     8   vector<int> v[51];
     9   cin>>n;
    10   for(i=0; i<n; i++){
    11     cin>>m;
    12     for( j=0; j<m; j++){
    13       int temp;
    14       scanf("%d", &temp);
    15       v[i].push_back(temp);
    16     }
    17   }
    18   cin>>m;
    19   for(i=0; i<m; i++){
    20     int a, b, cnt=0, sum=0;
    21     cin>>a>>b;
    22     map<int, int> mmap;
    23     for(j=0; j<v[a-1].size(); j++)
    24         if(mmap.count(v[a-1][j])==0) mmap[v[a-1][j]] = 1;
    25     for(j=0; j<v[b-1].size(); j++){
    26         if(mmap.count(v[b-1][j])==0) mmap[v[b-1][j]] = 2;
    27         else if(mmap[v[b-1][j]]==1){
    28             cnt++;
    29             mmap[v[b-1][j]]=2;
    30         }
    31     }
    32     printf("%.1f%%
    ", cnt*100.0/mmap.size());
    33   }
    34   return 0;
    35 }

    修改:在输入数据的时候,就组织数据, 并用更简洁的set来建立数据结构

     1 #include<iostream>
     2 #include<set>
     3 #include<vector>
     4 using namespace std;
     5 int main(){
     6   int n, m, i,j;
     7   cin>>n;
     8   vector<set<int>> v;
     9   for(i=0; i<n; i++){
    10     set<int> s;
    11     cin>>m;
    12     int temp;
    13     for(j=0; j<m; j++){
    14       cin>>temp;
    15       s.insert(temp);
    16     }
    17     v.push_back(s);
    18   }
    19   cin>>m;
    20   for(i=0; i<m; i++){
    21     int a, b;
    22     cin>>a>>b;
    23     int nc=v[a-1].size(), nt=0;
    24     for(auto it=v[b-1].begin(); it!=v[b-1].end(); it++){
    25       if(v[a-1].count(*it)!=0) nt++;
    26       else nc++;
    27     }
    28     printf("%.1f%%
    ", 100.0*nt/nc);
    29   }
    30   return 0;
    31 }
    有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
  • 相关阅读:
    7月25 SVN 提交报错 | mybatis like | 数据库字段设计 | 打包打小包
    7月24 springboot 打包打小包 | mybatis 逆向工程 | 接口返回数据 | 启动打包注意事项 | springboot redis 引入
    7月20号 添加字段报错 | 密码加密与传输
    7月19 登录失败 错误次数 | 字段类型被修改bug | 日志
    7月14 Enity对象的抽取
    7月13 mybatis调用存储过程
    7月12 导入项目到svn | logback配置日志输出
    7月11 配置数据库自己挖坑 | 代码覆盖率测试 | MockMvc 测试用例
    书架
    试题库问题
  • 原文地址:https://www.cnblogs.com/mr-stn/p/9156346.html
Copyright © 2011-2022 走看看