Codeforces Round #330 (Div. 2)C. Warrior and Archer【博弈+逆向思维】

题意:

已知n个数字,每次两个人从中取出一个数字,直到剩下2个数字。A希望最后2个数字尽可能小,B希望最后两个数字尽可能大。问,在相对聪明的情况下,最后两个数差的绝对值(距离)是多少


思路:逆向思维 。 考虑最后两个数字分别是X,Y(sort排序后)。

对于A来说,他希望两个数字尽可能小,那他不可能去删除X~Y之间的数字,假如他删这中间的数字,就相当于帮助了B去有能力删除 A左边or B右边的数字,使得距离变大。那么A肯定不划算。所以,那么index(y)-index(x)=(n-2)/2 + 1 暴力扫一遍就可以求得最小值


数据分析:2 ≤ n ≤ 200 000    0 ≤ ai ≤ 109


复杂度分析:O(n/2)


CODE:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn=2e5+50;
ll a[maxn];

int main(void)
{
    int n;
    cin >> n;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    ll ans=1e10;
    for(int i=1;i+n/2<=n;i++)
        ans=min(ans,a[i+n/2]-a[i]);
    cout << ans <<endl;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值