1. 程式人生 > 其它 >從數學的角度解決均分紙牌與環形均分紙牌問題

從數學的角度解決均分紙牌與環形均分紙牌問題

題目背景

總共\(n\)個人排成一行,第\(i\)個人手上有\(a_i\)張牌,且\(\sum_{i=1}^n a_i=m\),每個人每次可以把自己手中的一張紙牌傳遞給身邊的人,求至少多少次操作才能讓每個人手中持有的紙牌數相等(保證\(n\mid m\))

思路求解

將每個人視為一個節點,給出紙牌/收到紙牌視為連邊,邊權為進行傳遞的紙牌張數。當整除的關係存在時,由於從整個圖上來說每個節點互相可達,那麼均分紙牌的可行性是顯然的。接下來考慮最優方案。
首先,對於兩個節點來說,給出再給回是沒有意義的。因為可以直接等效為某一方的給出,節省交換次數。所以兩個節點中有且僅有一條單向邊(邊權可為0)。
接下來將問題分隔為子問題進行考慮。由於一個節點與另一個相連節點只能存在一條單向邊,且第一個節點只與第二個節點相連,所以先從它開始考慮。
\(a_1=\frac{m}{n}\)

,則直接考慮接下來\(n-1\)個節點構成的子問題(後續的都不和第一個節點再發生交換了);
\(a_1>\frac{m}{n}\),則將\(a_1-\frac{m}{n}\)張牌給\(a_2\),在\(a_2'=a_2+a_1-\frac{m}{n}\)的情況下考慮接下來\(n-1\)個節點構成的子問題;
\(a_1<\frac{m}{n}\),則向\(a_2\)“索要”\(\frac{m}{n}-a_1\)張牌,即使\(a_2<\frac{m}{n}-a_1\)也沒關係,因為可以放在後面的子問題中解決這個“賒賬”,在實際中表現為交換順序的不同。
如此往復下來,直到解決了第\(n-1\)
個節點的問題,第\(n\)個節點手上也一定已經恰好有了\(\frac{m}{n}\)張紙牌。
由於每一步的操作都是必須且不能減少的,最優性易得,接下來就是如何進行計算。

計算

\(x_i\)表示第\(i\)個節點向第\(i+1\)個節點之間邊的邊權,若為正說明邊由\(i\)指向\(i+1\)(給出),為負說明邊由\(i+1\)指向\(i\)(拿來)。我們需要計算得到\(\sum_{i=1}^{n-1} |x_i|\)。為了方便表示,令\(t=\frac{m}{n}\)。我們有如下的方程組(共\(n\)條方程):\( \begin{cases} a_1-x_1=t\\ a_2+x_1-x_2=t\\ \ \ \ \ \ \ \vdots\\ a_{n-1}+x_{n-2}-x_{n-1}=t\\ a_{n}+x_{n-1}=t \end{cases} \)


為了使結果更直觀,不妨增加一個\(x_n=0\)(在環形均分紙牌的時候它將具有實際意義)。方程組變為\( \begin{cases} a_1+x_n-x_1=t\\ a_2+x_1-x_2=t\\ \ \ \ \ \ \ \vdots\\ a_{n-1}+x_{n-2}-x_{n-1}=t\\ a_{n}+x_{n-1}-x_n=t \end{cases} \),將其表示為矩陣方程\(Ax=b\)的形式,則\( A=\begin{pmatrix} -1 & 0 & 0 & \cdots & 1\\ 1 & -1 & 0 & \cdots & 0\\ & & \ddots & & \vdots\\ & &1 & -1 & 0\\ & & & 1 &-1\\ \end{pmatrix}, x=\begin{pmatrix} x_1\\ x_2\\ \vdots\\ x_{n}\\ \end{pmatrix}, b=\begin{pmatrix} t-a_1\\ t-a_2\\ \vdots\\ t-a_n\\ \end{pmatrix} \)
依次對\(A\)\(b\)做第\(i\)行加到\(i+1\)\((i=1,2\cdots n-1)\)的行變換(以防讀者沒有學過線性代數,其實就是方程相加的化簡啦!),可得到\( A'=\begin{pmatrix} -1 & 0 & 0 & \cdots & 1\\ & -1 & 0 & \cdots & 1\\ & & \ddots & & \vdots\\ & & & -1 & 1\\ & & & &0\\ \end{pmatrix}, b'=\begin{pmatrix} t-a_1\\ 2t-(a_1+a_2)\\ \vdots\\ nt-(a_1+a_2+\cdots+a_n)\\ \end{pmatrix} \)
同時,\(nt=n\frac{m}{n}=m=\sum_{i=1}^n a_i\)。現在第\(n\)行表示一個\("0x=0"\)形式的方程,自然\(x_n=0\)不影響這個方程組的可解性。令\(s_i=\sum_{i=1}^n\),將\(x_n=0\)往回代,可得\(|x_i|=|i*t-s_i|\)。如此一來,均分紙牌的計算問題也就解決了。

環形均分紙牌

個人覺得這個問題難以討論出斷成鏈的可能性,所以不妨沿用原題的思路,將\(x_n\)視為\(n\)\(1\)連的邊,同理正為給出,負為拿來。沒有了\(x_n=0\)的限制後,上面的方程組仍然成立,同時可知\(x_n\)取任意值均有解。\(|x_i|=|i*t-s_i-x_n|(i=1,2\cdots n)\),若記\(b_i=i*t-s_i\),則總代價表示為\(\sum_{i=1}^n|b_i-x_n|\)。這樣就可以轉化為“貨倉選址”的模型:將\({b_i}\)進行排序後,若\(n\)為奇數則取\(x_n=b_{(n+1)/2}\),若\(n\)為偶數則取\(b_{n/2}\sim b_{n/2+1}\)中的任一整數,即可得到最小代價。