环形均分纸牌问题
环形均分纸牌问题
问题:给定n个整数,呈环形排列,每个数可以往两个相邻的数传递(每次至少1),最终要使得\(n\)个数相等,求传递的数的最小值
无解条件很显然:\(n\)不能整除\(\sum_{i=1}^na[i]\)
现在规定有解,设\(\overline{a}=\frac{\sum_{i=1}^na[i]}{n}\)
我们规定\(i\)向\(i-1\)传递\(x\),记为\(i-1\)向\(i\)传递\(-x\),这时候我们就可以把整个传递过程规定为单方向传递
设对于\(i\),则\(i\)传递给\(i+1\)的数为\(x_{i}\),特别的,设\(n\)传递给\(1\)
那么可以得到:
\[\left\{
\begin{aligned}
a_1-\overline{a}&=x_n-x_1\\
a_2-\overline{a}&=x_1-x_2\\
a_3-\overline{a}&=x_2-x_3\\
a_4-\overline{a}&=x_3-x_4\\
&……\\
a_n-\overline{a}&=x_{n-1}-x_n\\
\end{aligned}
\right.
\]
那么移项,可以得到:
\[\left\{
\begin{aligned}
x_1=&x_n-a_1+\overline{a}\\
x_2=&x_1-a_2+\overline{a}\\
x_3=&x_2-a_3+\overline{a}\\
&……\\
x_n=&x_{n-1}-a_n+\overline{a}\\
\end{aligned}
\right.
\]
将后式带入前式,先不考虑\(x_n\),有
\[x_i=x_n-\sum_{j=1}^ia_j+i·\overline{a}
\]
最终会有\(x_n=x_n\)
那么如果我们设\(s_i=\left(\sum_{j=1}^ia_j\right)-i·\overline{a}\),则原式化为\(x_i=x_n-s_i\)
因为我们最终目标是要求\(\min\left\lbrace\sum_{i=1}^n|x_i|\right\rbrace\)
原式=\(\min\left\lbrace\sum_{i=1}^n|x_n-s_i|\right\rbrace\)
此时因为我们的\(s\)的值都可以\(O(n)\)预处理出来,那么我们只需要求出\(x_n\)在何值的时候上式最小即可
那就是\(s\)的中位数了
此时,\(x_n\)的值知道之后,就可以回带求出所有的\(x\)值