zoukankan      html  css  js  c++  java
  • 环形均分纸牌问题可链化的证明

    环形均分纸牌问题可链化的证明

    先来看一下什么是均分纸牌问题

    均分纸牌问题

    n 个人站成一排,每个人手里有(A_i)张纸牌,每次操作可以使一个人从相邻的人手里那一张纸牌,问使得所有人手里纸牌数相等的最少操作数?(数据保证有解)

    对于均分纸牌问题,很显然可以贪心解决。

    对于第一个人来说,只能从第二个人那里拿牌,如果他少于平均,那么必然要从第二个人那里拿足够的牌直到达到平均值,如果多于平均,则必然要把多余的牌送给第二个人。

    如果用(sum)表示(A)的前缀和,(ave)为纸牌的均值(即最后每个手里的牌数),那么答案可以表示为

    [sum^n_{i=1} sum[i]-ave*i ]

    环形均分纸牌问题

    环形均分纸牌问题,就是将 n 个人排成一圈,则第一个人可以和第 n 个人传递纸牌。

    如果我们可以证明某两个人直接可以不用传递纸牌也能获得最优解,那么我们可以尝试断开每两个人之间的连接,然后使用非环形均分纸牌问题中的方法来求解。

    网上很多解答都是在可链化的基础上推出了求中位数求解的结论,然而关于可链化(即可以将某两个人的连接断开而不影响最少操作次数)的证明问题却语焉不详。

    实际上,想要通过枚举各种情况证明可链化是非常困难的,因为没有办法枚举所有情况。

    这题更严谨的做法应当是假设(X_i) 表示第 (i) 个人向第(i-1) 个人传递了 (X_i) 张纸牌 ((X_1) 表示第一个向第 n 个),值为负表示反向。

    操作次数就可以表示为 (sum^n_{i=1} |X_i|)

    由于传递后每个人的牌都为 (ave) ,所以可以列出一系列方程

    [A_1 + X_2 - X_1 = ave \ A_2 + X_3 - X_2 = ave \ dots \ A_{n-1} + X_n - X_{n-1} = ave \ A_n + X_1 - X_n = ave \ ]

    (X_1) 表示 (X_2,X_3dots X_n) 可得到

    [egin{aligned} X_2 &= X_1 - (A_1 - ave) \ X_3 &= X_1 - (A_2 + A_1 - 2*ave) \ dots \ X_n &= X_1 - (A_{n-1} + A_{n-2} + dots + A_1 - (n-1)*ave) \ end{aligned} ]

    (S_i = sum^{i-1}_{j=1} (A_j-ave) 2le ile n)

    特别的,(S_1=0)

    可得

    [egin{aligned} X_2 &= X_1 - S_2 \ X_3 &= X_1 - S_3 \ dots \ X_n &= X_1 - S_n \ end{aligned} ]

    操作次数可以表示为

    [sum^n_{i=1}|X_i| = sum^n_{i=1} |X_1-S_i| ]

    那么原问题变成了求 (X_1) 的值使得上述求和最小,上述求和可以看作是求点到直线的距离。

    • 先将 (S) 数组从小到大排序。

    • 如果 n 为奇数,那么 (X_1 = S_{n/2+1})

    • 如果 n 为偶数,那么 (X_1 in [S_{n/2},S_{n/2+1}])

    可以发现,不论 n 为奇数还是偶数,(X_1) 都可以取到(S) 数组中的某个值使得求和最小,因此存在某个 (X_i = X_1 - S_i = 0),即有两个人之间没有纸牌传递,因此这种解法实际上证明了环形均分纸牌问题的可链化

  • 相关阅读:
    好物推荐,码出高效
    C#设置session过期时间
    [C#] Request.QueryString()测试:用html而非asp控件实现简单登录验证并保存值到Session中
    .aspx页面 用html按钮传送数据到 .aspx.cs后台的和“利用Ajax连接aspx与aspx.cs”方法记录
    Visual Studio出现“ 激活远程语言服务器 c#/Visual Basic 语言服务器客户端出错”请运行devenv/log并检查…………“错误解决办法
    解决ubuntu server下屏幕显示不全问题的详解
    关于ubuntu选择desktop版本还是sever版本的一篇随笔
    MAC系统npm安装依赖,报错npm ERR! code ECONNREFUSED
    Linux 常用命令总结
    Mac电脑查询IP
  • 原文地址:https://www.cnblogs.com/gooooooo/p/12461154.html
Copyright © 2011-2022 走看看