1005考试T2

1005考试T2

​ 题目大意:

​ Alice和Bob在玩游戏。数轴上有𝑛枚石子(𝑛为偶数),每个位置上至多只有一枚石子。Alice和Bob轮流把某个石子取走,Alice先手,直至数轴上只剩下两枚石子。Alice想要让这两枚石子的距离尽量小,而Bob则想让它们之间的距离尽量大。在双方都进行完美操作的情况下,最终剩下的两枚石子之间的距离会是多少呢?

​ 博弈论。

​ Alice先手,那么他就占主动,Bob占被动。

​ Alice像让石子的距离尽可能小,那么他的完美操作是在两边取石子。而Bob被动的取石子,他的完美操作是取中间的石子。这里说的两边和中间是相对于最后剩下的那两个石子说的。

​ 所以最后剩下的那两个石子的间隔肯定是\(n / 2\),因为里边被Bob取了\(n / 2 - 1\)个石子嘛。最后的答案我们要对所有的间隔为\(n / 2\)的石子的距离取个min,因为Alice占主动权,想让这些石子的距离尽量小。

#include <bits/stdc++.h>

using namespace std;

inline long long read() {
    long long s = 0, f = 1; char ch;
    while(!isdigit(ch = getchar())) (ch == '-') && (f = -f);
    for(s = ch ^ 48;isdigit(ch = getchar()); s = (s << 1) + (s << 3) + (ch ^ 48));
    return s * f;
}

const int N = 1e5 + 5;
int n, ans;
int a[N];

int main() {

    n = read(); ans = 1e9 + 5;
    for(int i = 1;i <= n; i++) a[i] = read();
    sort(a + 1, a + n + 1);
    for(int i = 1;i <= n / 2; i++) 
        ans = min(ans, a[i + n / 2] - a[i]);
    printf("%d", ans);

    fclose(stdin); fclose(stdout);
    return 0;
}

/*
6
0 1 3 7 15 31

10
0 1 3 6 7 12 15 19 31 40

20
713900269 192811911 592111899 609607891 585084800 601258511 
223103775 876894656 751583891 230837577 971499807 312977833 
344314550 397998873 558637732 216574673 913028292 762852863 
464376621 61315042
*/
posted @ 2020-10-05 19:03  C锥  阅读(97)  评论(0编辑  收藏  举报