均分纸牌问题

n 个人排成一列(或一个环),第 i 个人手里有 ci 张牌,在每一步操作中,可以让某人给他左边或右边的人一张牌,问最少多少步可以让每个人手中的牌数相等。

线性均分纸牌问题

定义 avg 为总数的平均数,如果 avg 不是整数的话,就是无解。否则要使每堆纸牌的数量一样多的话,那么经过移动后要使 Ai=avg

对于第一堆牌,它会与第二堆牌产生 |x1avg| 张牌的交换,多退少补,并累加答案。此时发现第一堆牌已经符合条件了,那么第一堆就可以忽略了,此时第二堆就变成了第一堆,继续重复上述步骤。

为什么这样做是最优的呢?可以发现在上述过程中,每一步都是必须的,没有多余的步骤,所以必然是最优解,这也是贪心思想的体现。

如果移牌的过程中出现负数怎么办?假设 ci 在移动过程中是负数,那么接下来他一定会在 ci+1 处拿牌。可以认为 i+1i 给予牌是在 i 给予 i1 牌之前,所以不影响结果。

对于如何统计答案,模拟上述过程,发现就是遍历每个人,并将其纸牌数变为 avg。假设要令 ci=avg,由算法流程可知,前 i1 个人都有 cj=avg,而前 i 个人共有 toti 张纸牌(totc 的前缀和),并且后面的人没有给前 i 个人牌,所以说现在的 ci=toti(i1)×avg,故第 i 个人与第 i+1 个人之间的纸牌交换数量为 |ciavg|=|totii×avg|。而总的答案就是: i=1n|totii×avg|
为了方便起见,可以一开始就将 ciavg,那么最终就要使每个 ci=0,那么答案就是:i=1n|toti|

环形均分纸牌问题

约定:此问题沿用上述线性问题解法中的定义

解法一

假设第 i 个人给了第 i1 个人 xi 张卡牌,特别的,x1 表示第 1 个人给了第 n 个人的牌的数量,所以此题的要求就是最小化 i=1n|xi|

由题意可得以下方程组:

{c1x1+x2=0c2x2+x3=0c3x3+x4=0cn1xn1+xn=0cnxn+x1=0

xii>1)全部以 x1 表示,可得:

{x1=x10x2=x1c1x3=x1(c1+c2)xn=x1(i=1n1ci)

ti=j=1i1cj,那么 xi=x1ti,所以 i=1n|xi|=i=1n|x1ti|

所以只需要选确定 x1 的值就行了,这是经典的仓库选址问题,由结论可得,x1t 序列的中位数。

解法二

首先,有一个结论,那就是一定有一种最优解中有两个人之间没有发生纸牌交换

证明

由解法一可得 x1t 序列的中位数,如果 t 的长度是奇数,那么 x1=tn2+1,否则 x1[tn2,tn2+1],所以 x1 一定可以等于 t 中的某一个值,那么就有一个 xi=x1ti=0,得证。

有了上述结论,就可以断环为链,转化为线性问题,此时 ans=i=1n|toti|,所以只需要搞清楚 tot 数组的变化即可。

假设在第 k 个人之后断开,此时的 c 数组就变为了 ck+1,ck+2,,cn,c1,c2,,ck其对应的 tot 数组也就变为了 totk+1totk,totk+2totk,,totntotk,tot1+totntotk,,totk+totntotk因为每个 ci 都减去了 avg,所以 totn=0,那么此时 ans=i=1n|totitotk|,与解法一的结论相似,即 totktot 序列的中位数。

posted @   zhuluoan  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示