均分纸牌问题是指一些牌堆可以将自己的纸牌转移到相邻牌堆上,问最少多少次转移操作可以使得a1=a2=...=an,并且保证最初n|Σa。

一、序列均分纸牌 https://www.luogu.com.cn/problem/P1031

1号牌堆跟n号牌堆不相邻。

把1号作为突破口,因为他只能和2号一个牌堆操作。考虑一次性将a1变成av(平均数),那么a1需要+av-a1张牌,因此a2-=(av-a1)。正负号代表是从哪边转移到哪边。但是还是会出现a1需要这么多牌而a2<需求的情况。我们可以姑且把此刻(此次操作结束后)的a2看做“透支状态”(负数张牌),而只要最终a2能变成av了其实就是没有问题的。具体为什么:使a2从负数变成0的这些 a2获得的牌 就可以预先加到a2上然后转移给a1。但是题目并不关心操作具体如何进行,所以我们不需要管这么多。

二、环形均分纸牌https://www.acwing.com/problem/content/124/

a1,a2,...,an围成一个圈

我们失去突破口了,因此解法完全不同。

设num[i]表示a[i]需要给a[i-1]的纸牌张数(同样的,负数代表反向)。于是

\[a[1]+num[2]-num[1]=av\\ a[2]+num[3]-num[2]=av\\ ...\\ a[n-1]+num[n]-num[n-1]=av \]

移项得

\[num[2]=num[1]-a[1]+av\\ num[3]=num[2]-a[2]+av=num[1]-(a[1]+a[2])+2av ...\\ num[n]=num[1]-(a[1]+a[2]+...+a[n-1])+(n-1)av \]

如果将\(num[i]\)写成num[1]-c[i-1]的形式,容易发现

\[c[0]=0 c[i]=c[i-1]+a[i]-av \]

因此所有c[i]已知
又因为

\[ans=|num[1]|+|num[2]|+...+|num[n]|\\ =|num[1]-c[0]|+|num[1]-c[1]|+|num[1]-c[2]|...+|num[1]-c[n-1]| \]

根据货仓选址,可知取num[1]取c[0],c[1],...,c[n-1]中位数时ans最小

变式:周期k均分纸牌

排成一圈,a[i]只能跟a[i-k]和a[i+k]转移(±k表示向左/右第k人)

则构成gcd(k,n)组环形均分纸牌问题,组与组之间不相关联