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