题目描述
Alice 和 Bob 玩游戏,两人各有一个长度为 n 的数组,其中 Alice 的数组是 a,Bob的数组是 b;每一轮,两人从各自的数组中移除其中一个数,直至各自的数组中都只剩一个数时游戏结束,从 Alice 先开始。
假设 Alice 的数组中所剩最后一个数为 x,Bob 的数组中所剩的最后一个数为 y,这个游戏没有胜负,但 Alice 想要 x 与 y 之差的绝对值尽量大,而 Bob 则希望所剩下的两个数之差的绝对值越小越好。
对于这个游戏,Alice 和 Bob 都是最顶尖的玩家,均使用最优策略,在此情况下你知道最后 x 与 y 之差的绝对值是多少吗?
输入
输入只包含一组数据;
第一行输入一个正整数 n(1 ≤ n ≤ 1000),表示两个数组的长度;
第二行输入用空格隔开的 n 个整数,每个整数 ai 满足 1 ≤ ai ≤ 109,这是 Alice 的数组;
第三行输入用空格隔开的 n 个整数,每个整数 bi 满足 1 ≤ bi ≤ 109,这是 Bob 的数组;
输出
输出在两人都采取最优游戏策略的情况下,x 与 y 之差的绝对值。
样例输入
4
2 14 7 14
5 10 9 22
样例输出
4
提示
在测试数据中,两人均采取最优策略的情况下,x = 14,y = 10,因此最终结果为 4。
思路
看似博弈,实则贪心。
A先B后,A要保留差值最大的,而B保留差值最小的,所以每次让A去选差值最小的数,B去选差值最大的数。所以我们可以记录ai和bj(1, n)的差值最小值最大即可。
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e3 + 5;
const int INF = 0x3f3f3f3f;
int a[MAXN], b[MAXN];
void solve() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; ++i) {
scanf("%d", &b[i]);
}
int ans = 0;
for (int i = 0; i < n; ++i) {
int mi = INF;
for (int j = 0; j < n; ++j) {
mi = min(mi, abs(a[i] - b[j]));
}
ans = max(mi, ans);
}
printf("%d\n", ans);
}
int main() {
solve();
return 0;
}