hihoCoder #1695 公平分队II
题目大意
Alice 和 Bob 在玩一个游戏。Alice 将 \(1\) 到 \(2n\) 这 \(2n\) 个整数分成两组,每组 \(n\) 个。Bob 从中选一组,剩下一组归 Alice。Alice 可以与 Bob 交换一个数也可以不换。游戏目标是使自己所得的 \(n\) 个数之和最大。两人都足够聪明,试问 Alice 所得的 \(n\) 个数之和是多少?
解法
写这篇随笔是为了总结一下这一类问题该从哪里入手进行分析。
这道博弈题和很久以前遇到的春游计划那道题一样,解法是倒推。
key observation:【 Bob 必定会选择最优的那一组数(选法也许不唯一)】
记 Alice 选的 \(n\) 个数为 \(a_1< a_2 < \ldots < a_n\), Bob 选的为 \(b_1 < b_2 < \ldots < b_n\) 。
若 Alice 不必与 Bob 交换一个数,即有 \(a_1 > b_n\),那么此时 Bob 选的 \(n\) 个数为 \(1, 2, 3, \ldots, n\);然而这是最差的结果;换言之,若Bob 选另外 \(n\) 个数,其结果必然不比此结果差,从而此种情况不可能出现,所以 Alice 必定会拿 \(a_1\) 交换 \(b_n\)。根据 Bob 会在二者中取最优者,我们有
\[
a_1 + \sum_{1\le i < n} b_i \ge b_1 + \sum_{1\le i<n} a_i
\]
即
\begin{equation}
\sum_{2\le i \le n-1} b_i - ai \ge 0 \qquad (n\ge 2) \label{condition}
\end{equation}
为了方便,我们将 \eqref{condition} 式左边记做 \(\Delta\),将 \(1\) 到 \(2n\) 的和记做 \(S\),将 Alice 所得的 \(n\) 个数之和记为 \(S_A\),即
\[
S_A = b_n + \sum_{2\le i\le n} a_i
\]
现在问题转化为
Alice 如何分组才能在满足 \eqref{condition} 式的前提下使得 \(S_A\) 最大?
我们有
\[
S_A = (S -\Delta + a_n + b_n - a_1 - b_1)/2
\]
观察可知,对于 \(n\ge 2\),若 \(n\) 为偶数,\(a_n\)、\(b_n\) 取最大的两个数,\(a_1\)、\(b_1\) 取最小的两个数,\(\Delta\) 的值可取到 \(0\);当 \(n\) 为奇数时,同样使 \(a_n\)、\(b_n\) 取最大的两个数,\(a_1\)、\(b_1\) 取最小的两个数,此时 \(\Delta\) 的值可取到 \(1\),并且这是此时的最优结果,理由是:当且仅当按上述方法取值时,\(a_n + b_n - a_1 - b_1\) 的值最大。