CodeForces 595C

题意:一个战士和一个箭士PK,战士是近战,他要距离箭士的尽可能近,而箭士是远战,他要距离战士尽可能远。现在,他们有n个位置,但是要去掉(n-2)个位置,从战士开始,每人轮流去掉一个位置,求如何去掉点,使他们的距离最优,输出最优距离。

题解:战士要使距离更近,应该是优先去掉边缘上的点,反之,箭士要使距离更远,应该尽可能去掉中间的位置;

战士想要使得两个位置尽可能近,而这两个位置的下标距离,再小也不能小于n/2;箭士想要使得两个位置尽可能远,而这两个位置的下标距离,再大也不能超过n/2。结合他们的小标距离,最优的应该是小标距离刚好为n/2;战士可以决定的是;选取小标距离为n/2中的最小距离。

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int a[200005];
#define INF 0x3f3f3f3f

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    int ans=INF;
    int dis=n/2;
    sort(a,a+n);
    for(int i=dis;i<n;i++)
        ans=min(ans,a[i]-a[i-dis]);
    printf("%d
", ans);
    return 0;
}
原文地址:https://www.cnblogs.com/mgxj/p/5541561.html