SDUT 3801 离散题目7

本文介绍了一种算法,该算法通过输入两个整数n和m及对应的集合A和B,来生成一个二进制字符串,用以表示集合B是否包含集合A中的元素。

Problem Description

DaYu在新的学习开始学习新的数学知识,一天DaYu学习集合的时候遇到一个问题,他有一个集合A和A的子集B,他想用一个二进制串表示集合B。

Input

多组输入,每组的第一行有两个数n,m,(0< m < n < 10^5).

第二行输入n个数表示集合A,第三行输入m个数表示集合B,|data_i|< 10^5

Output

输出一个01字符串表示集合B

Example Input

10 5
1 2 3 4 5 6 7 8 9 10
1 3 5 7 8

Example Output

1010101100

代码:意思就是,n个数,然后输入m个数,对应位置上有的话就是1没有的话就是0

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n, m, i;
    vector<int> a;
    set<int> b;
    while(~scanf("%d %d", &n, &m))
    {
        int num;
        for(i = 0; i < n; i++)//n个数
        {
            scanf("%d", &num);
            a.push_back(num);
        }
        for(i = 0; i < m; i++)//m个数
        {
            scanf("%d", &num);
            b.insert(num);
        }
        for(i = 0; i < n; i++)//没有的话0,有的话1
        {
            if(!b.count(a[i])) printf("0");
            else printf("1");
        }
        printf("\n");
        a.clear(); b.clear();
    }
    return 0;
}
### 关于SDUT 离散数学 OJ 实验一 以下是基于提供的引用内容以及相关知识整理的关于 **SDUT 离散数学 OJ 实验一** 的题目描述及其解答方法。 --- #### 题目解析与实现方案 实验一通常涉及离散数学的基础概念,例如双射判断、幺元和逆元计算等内容。以下是对几个典型题目的分析: 1. **双射判定问题** - 描述:给定两个集合 \( A \) 和 \( B \),以及它们之间的映射关系,判断该映射是否为双射。 - 判断条件: - 映射需满足单射(injective),即对于任意不同的 \( x_1, x_2 \in A \),有 \( f(x_1) \neq f(x_2) \)[^1]。 - 映射还需满足满射(surjective),即对于每一个 \( y \in B \),存在至少一个 \( x \in A \) 使得 \( f(x) = y \)。 - 解法思路: - 使用哈希表记录映射关系,验证是否存在重复值或未被覆盖的目标值。 - Python代码示例: ```python def is_bijection(n, m, k, mapping): from collections import defaultdict domain_set = set() codomain_set = set(range(1, m + 1)) value_count = defaultdict(int) for i in range(k): x, y = mapping[i] if y not in codomain_set or x in domain_set: return "NO" domain_set.add(x) value_count[y] += 1 # Check surjectivity and injectivity if len(domain_set) != n or any(count != 1 for count in value_count.values()): return "NO" return "YES" # 输入样例处理逻辑省略... ``` 2. **幺元与逆元计算** - 描述:定义一种二元运算 \( * \),其形式为 \( a*b = a+b-k \),求解代数系统的幺元和任一元素的逆元[^2]。 - 计算过程: - 幺元 \( e \) 定义为满足 \( a*e = a \) 的唯一元素,则可得方程 \( a+k-e=a \Rightarrow e=k \)。 - 对于任意元素 \( a \),其逆元 \( b \) 应满足 \( a*b=e \),即 \( a+b-k=k\Rightarrow b=2k-a \)[^2]。 - Python代码示例: ```python def find_identity_and_inverse(a_list, k): identity_element = k inverse_elements = {a: (2*k - a) for a in a_list} return identity_element, inverse_elements # 测试用例 result = find_identity_and_inverse([1, 2, 3], 5) print(f"Identity Element: {result[0]}") print(f"Inverse Elements: {result[1]}") ``` 3. **补图最大度与最小度** - 描述:已知无向图的邻接矩阵表示方式,求取对应完全图下的相对补图的最大度和最小度[^4]。 - 方法概述: - 构造原图对应的完全图邻接矩阵; - 将两者的差作为新图的邻接矩阵; - 统计各顶点的度并找到极值。 - Python代码片段: ```python def complement_graph_degrees(adj_matrix): n = len(adj_matrix) complete_adj = [[1]*n for _ in range(n)] for i in range(n): complete_adj[i][i] = 0 comp_adj = [] for i in range(n): row = [(complete_adj[i][j]-adj_matrix[i][j]) for j in range(n)] comp_adj.append(row) degrees = [sum(comp_adj[i]) for i in range(n)] max_degree = max(degrees) min_degree = min(degrees) return max_degree, min_degree ``` --- #### 输出结果说明 上述代码实现了针对不同类型的离散数学问题的具体解决方案,并通过合理的算法设计保证了时间复杂度的有效控制。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值