乐山师范程序设计大赛2020-I: 数组重排【贪心】

题目描述

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;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空皓月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值