当前位置: 代码迷 >> 综合 >> 1063 Set Similarity (25分)
  详细解决方案

1063 Set Similarity (25分)

热度:48   发布时间:2024-01-26 17:59:03.0

文章目录

  • 1 题目
  • 2 解析
    • 2.1 题意
    • 2.2 思路
  • 3 参考代码

1 题目

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 (≤104
?? ) and followed by M integers in the range [0,109]. 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 3Sample Output:
50.0%
33.3%

2 解析

2.1 题意

求给出的两个集合的相似的百分比(相同元素个数/不同元素个数),即两个集合的交集和并集的比

2.2 思路

用set实现自动去重,也可以排序后去重(但是有些复杂);
查看第一个集合的元素是否在第二集合中出现可以用find()或count()函数。

  • 1 首先用set存储每个集合(实现自动去重);
  • 2 以第一个集合的元素为基准,比较第二个集合中相同的元素的个数Nc,以第二个集合的元素总个数为Nt初始值,当两个集合出现不同元素时,Nt++;
  • 3 最后输出Nc/Nt的百分比

3 参考代码

#include <cstdio>
#include <set>using std::set;const int MAXN = 10010;
set<int> s[MAXN];int main(int argc, char const *argv[])
{int n, m, k;scanf("%d", &n);int num;for (int i = 1; i <= n; ++i){scanf("%d", &m);for (int j = 0; j < m; ++j){scanf("%d", &num);s[i].insert(num);}}int idx1, idx2;scanf("%d", &k);for (int i = 0; i < k; ++i){scanf("%d%d", &idx1, &idx2);int Nc = 0, Nt = s[idx2].size();set<int> temp;for (set<int>::iterator it = s[idx1].begin(); it != s[idx1].end(); it++){//用find函数// if(s[idx2].find(*it) != s[idx2].end()){// Nc++;// }else{// Nt++;// }//用count函数if(s[idx2].count(*it) != 0){Nc++;}else{Nt++;}}printf("%.1f%%\n", (Nc * 100.0)/ Nt);}return 0;
}
  相关解决方案