• 从数学的角度解决均分纸牌与环形均分纸牌问题


    题目背景

    总共\(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}\)中的任一整数,即可得到最小代价。

  • 相关阅读:
    XML 学习(二)
    maven运用,在eclipse中将maven本地仓库加入,创建maven项目
    windows提权
    windows文件权限问题
    更换tomcat版本遇到问题解决方法
    服务器安装vmware遇到的问题
    windows远程账户禁用/允许/隐藏
    使用maven下载jar包
    编写WebService 并发布到IIS中
    一些有趣的javascript小测试
  • 原文地址:https://www.cnblogs.com/hkr04/p/dividingCards.html
Copyright © 2020-2023  润新知