集合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(x∈A→∃y∃z(y∈B∧z∈B∧(y+z=x)))
求值并输出结果。
输入格式:
4行。
第一行是一个整数N(1≤N≤1e4 ),接下来一行有N个整数(范围[1,1e5 ],空格分开),表示集合B中的元素;
第三行是一个整数M(1≤M≤1e3 ),接下来一行有M个整数(范围[1,1e5 ],空格分开),表示集合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太慢了。。。