离散数学 习题篇 —— 谓词公式练习

集合A,B由输入的一系列整数构成,对表达式

∀ x ( x ∈ A → ∃ y ∃ z ( y ∈ B ∧ z ∈ B ∧ ( y + z = x ) ) ) ∀x(x∈A→∃y∃z(y∈B∧z∈B∧(y+z=x))) x(xAyz(yBzB(y+z=x)))

求值并输出结果。

输入格式:

4行。
第一行是一个整数N(1≤N≤1e4​​ ),接下来一行有N个整数(范围[1,1e​5​​ ],空格分开),表示集合B中的元素;
第三行是一个整数M(1≤M≤1e​3​​ ),接下来一行有M个整数(范围[1,1e​5​​ ],空格分开),表示集合A中的元素。

输出格式:
1行,若上述表达式为真,输出true;否则,输出false。

输入样例1:

5

1 2 3 4 5

4

5 3 7 9

输出样例1:

true

输入样例2:

5

1 2 3 4 5

4

5 3 7 11

输出样例2:

false

题目解析:
首先分析题目。题目其实就是一个表达式,简单明了。看上去很长,能难搞,那么翻译一下:对于任意一个x,如果x在集合A中,那么B集合中存在y,z使得y + z = x。最直白说,就是在集合A中的任意一个元素x都能再B中找到对应的y,z让y + z = x成立
思路就是遍历一边,把A中的每个元素都拿出来看看是不是在B中能找到符合题意的y,z。十分暴力,我们先来看一下

n = int(input())
B = set([int(x) for x in input().split()])
m = int(input())
A = set([int(x) for x in input().split()])

cnt = 0
for i in A:
    cnt = 0
    for j in B:
        if i - j in B:
            cnt = 1
            break
    if not cnt:
        break

print("true") if cnt == 1 else print("false")

暴力去搞,当然直接,数据稍微大点可能就卡住了,果不其然,GG
在这里插入图片描述
python太慢了,数据量太大果然还是超时了。。。
那么,我们不用python试一下呢

#include <bits/stdc++.h>
using namespace std;
int main(int argc, char const *argv[])
{
    set<int> A, B;
    int n, m;
    scanf("%d", &n);
    while (n--)
    {
        int a;
        scanf("%d", &a);
        B.insert(a);
    }
    scanf("%d", &m);
    while (m--)
    {
        int a;
        scanf("%d", &a);
        A.insert(a);
    }

    int cnt = 0;
    for (int i : A)
    {
        for (int j : B)
        {
            auto s = B.find(i - j);
            if (s != B.end())
            {
                cnt++;
                break;
            }
        }
    }
    printf("%s", cnt == A.size() ? "true" : "false");
    return 0;
}

在这里插入图片描述
思路问题不大,就是python太慢了。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值