题目描述
给定一个整数数组 A,其包含 n 个正整数 a1,a2,…,an 以及一个整数数组 B,其包含 m 个正整数 b1,b2,…,bm。
请从数组 A 中挑选一个元素 a 并从数组 B 中挑选一个元素 b,使得 a+b 既不包含于 A 也不包含于 B。
例如,如果 A=[2,1,7] 而 B=[1,3,4],则可以从 A 中选取 1,从 B 中选取 4,这样得到的数字 1+4=5 既不在 A 中,也不在 B 中。
但是,我们不能从 A 中选取 2,从 B 中选取 1,因为得到的数字 2+1=3 包含于 B。
可以证明这样的数对一定存在,如果答案不唯一则输出任意合理答案均可。
输入格式
第一行包含整数 n。
第二行包含 n 个整数 a1,…,an。
第三行包含整数 m。
第四行包含 m 个整数 b1,…,bm。
输出格式
共一行,输出 a 和 b,中间用空格隔开。
数据范围
对于 30% 的数据,1≤n,m≤10
对于 100% 的数据,1≤n,m≤100,1≤ai,bi≤200
样例
输入样例1:
1
20
2
10 20
输出样例1:
20 20
输入样例2:
3
3 2 2
5
1 5 7 7 9
输出样例2:
3 1
输入样例3:
4
1 3 5 7
4
7 5 3 1
输出样例3:
1 1
算法1
(暴力枚举) $O(n^2)$
时间复杂度
参考文献
python3 代码
an = int(input())
a = [int(x) for x in input().split()]
bn = int(input())
b = [int(x) for x in input().split()]
visited = set()
for x in a:
visited.add(x)
for y in b:
visited.add(y)
find = False
for x in a:
if find == True:
break
for y in b:
if (x + y) not in visited:
print("{} {}".format(x, y))
find = True
break
算法2
(贪心) $O(n)$
两个数组都是正数
取两者最大的数相加,一定不会出现过
自己做题的时候,为了抢时间,“慌不择路”的感觉
时间复杂度
参考文献
python3 代码
an = int(input())
a = [int(x) for x in input().split()]
bn = int(input())
b = [int(x) for x in input().split()]
print("{} {}".format(max(a), max(b)))
C++ 代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int an; cin >> an;
int a[an];
int maxa = 0;
for (int i = 0; i < an; i ++)
{
cin >> a[i];
maxa = max(maxa, a[i]);
}
int bn; cin >> bn;
int b[bn];
int maxb = 0;
for (int i = 0; i < bn; i ++)
{
cin >> b[i];
maxb = max(maxb, b[i]);
}
cout << maxa << ' ' << maxb << endl;
return 0;
}