环形均分纸牌问题

环形均分纸牌问题

问题:给定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\)

posted @ 2022-11-30 22:45  spdarkle  阅读(25)  评论(0编辑  收藏  举报