均分纸牌系列问题
均分纸牌问题是指一些牌堆可以将自己的纸牌转移到相邻牌堆上,问最少多少次转移操作可以使得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)组环形均分纸牌问题,组与组之间不相关联