首页 > 其他 > 详细

1005考试T2

时间:2020-10-05 21:47:57      阅读:29      评论:0      收藏:0      [点我收藏+]

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
*/

1005考试T2

原文:https://www.cnblogs.com/czhui666/p/13771032.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!