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\) 的值最大。

posted @ 2018-03-17 21:59  Pat  阅读(208)  评论(0编辑  收藏  举报