L2-005 集合相似度(vector、set求并交集)

简介: L2-005 集合相似度(vector、set求并交集)

给定两个整数集合,它们的相似度定义为: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


输出样例:


1. 50.00%
2. 33.33%


#include <iostream>
#include <algorithm>
#include <vector>
// #include <iterator>
using namespace std;
const int N = 60;
vector<int>v[N];
int main()
{
    int n; scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        int k; scanf("%d", &k);
        while (k--)
        {
            int x; scanf("%d", &x);
            v[i].push_back(x);
        }
        sort(v[i].begin(), v[i].end());
        v[i].erase(unique(v[i].begin(), v[i].end()), v[i].end());
    }
    scanf("%d", &n);
    while (n--)
    {
        int a, b, cnt = 0; scanf("%d%d", &a, &b);
        vector<int> res;
        set_intersection(v[a].begin(),v[a].end(),v[b].begin(),v[b].end(),back_inserter(res));
        printf("%.2lf%%\n", res.size() * 100.0 /(v[a].size() + v[b].size() - res.size()));
    }
    return 0;
}


#include <iostream>
#include <set>
using namespace std;
using std::cin;
using std::cout;
using std::endl;
const int N = 60;
set<int>s[N];
int n;
int k, x, a ,b;
int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> k;
        while (k--) cin >> x,s[i].insert(x);
    }
    cin >> n;
    while (n-- )
    {
        cin >> a >> b;
        int cnt = 0;
        set<int>:: iterator it;
        for (it = s[a].begin(); it != s[a].end(); it++)
            if (s[b].find(*it) != s[b].end())
                cnt++;
        printf("%.2lf%%\n", cnt * 100.0 / (s[a].size() + s[b].size() - cnt));
    }
    return 0;
}
目录
相关文章
|
30天前
|
存储 NoSQL 关系型数据库
Redis 集合(Set)
10月更文挑战第17天
36 5
|
1月前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
40 6
|
1月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
33 2
|
16天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
16天前
|
开发者
除了交集运算,Set 类型还可以用于哪些数据结构的操作?
【10月更文挑战第30天】`Set`类型在数据结构操作方面提供了丰富的功能和便利,能够帮助开发者更高效地处理各种数据集合相关的任务,提高代码的简洁性和性能。
|
16天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
16天前
|
Java 开发者
|
16天前
|
算法 JavaScript 前端开发
使用 Set 类型实现数组的交集运算
【10月更文挑战第30天】使用 `Set` 类型实现数组的交集运算是一种常见且有效的方法,它为我们处理数据集合的运算提供了一种便捷的途径。通过合理地运用这种方法,我们可以轻松地实现数组的交集计算,并在各种编程任务中灵活运用。
|
1月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
32 4
|
1月前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
26 5

热门文章

最新文章

下一篇
无影云桌面