均分纸牌模型总结
总背景
- 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张(已给出)
- 只能相邻移动
一、noip原题 均分纸牌
要求:
- 链状非环形
- 每次移动张数不限
- 相邻牌间移动次数不限
- 求最小移动次数
由于模型过于经典,此处不再赘述,简单贪心即可
#include<cstdio>
main()
{
int n,a[1000],s=0,t=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
s+=a[i];
}
s/=n;
for(int i=1;i<n;i++)
if(a[i]!=s)
{
t++;
a[i+1]-=s-a[i];
a[i]+=s-a[i];
}
printf("%d",t);
}
二、 HDOJ 5353 Average
要求:
- 环形
- 每次只能移一张
- 相邻牌间只能移一次
- 求是否存在移法
分析:以上性质使得此题无比简单,枚举前两个状态然后推过去就行了,不行就return(口糊,逃)
大佬正解:做法是枚举x[1],x[n]的所有可能,x[2~n-1]能递推出来。x[i]表示i给i+1的值(0/-1/1) 那么 a[i] - x[i] + x[i-1] == ave
(借鉴于 [https://www.cnblogs.com/Running-Time/p/4709964.html])
三、Uva 11300 Spreading the Wealth
要求:
- 环形
- 每次移动张数不限
- 移动次数不限
- 求最小移动张数
借鉴于https://www.cnblogs.com/kuangbin/archive/2012/10/24/2736733.html
原来金币数为a1,a2,……,`an.
最终的金币为这些数的平均值,设为A
xi表示i给i+1的金币个数
a1+xn-x1=A
a2+x1-x2=A
a3+x2-x3=A
a4+x3-x4=A
…
an+x(n-1)-xn=A
利用后面n-1个等式,用x1表示 x2,x3,…xn
x2=x1-(A-a2)
x3=x1-(2*A-a2-a3);
…
结果就是求|x1|+|x1-b1|+|x1-b2|+…+|x1-b[n-1]|的最小值,取中位数