均分纸牌模型总结 [贪心][数学]

本文探讨了三种不同条件下的均分纸牌问题:非环形无限移动、环形单次单张移动与环形无限移动。通过贪心算法、枚举与数学推导,解析了各场景下最优解的求解策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

均分纸牌模型总结

总背景

  1. 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张(已给出)
  2. 只能相邻移动

一、noip原题 均分纸牌

要求:

  1. 链状非环形
  2. 每次移动张数不限
  3. 相邻牌间移动次数不限
  4. 求最小移动次数

由于模型过于经典,此处不再赘述,简单贪心即可

#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

要求:

  1. 环形
  2. 每次只能移一张
  3. 相邻牌间只能移一次
  4. 求是否存在移法

分析:以上性质使得此题无比简单,枚举前两个状态然后推过去就行了,不行就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

要求:

  1. 环形
  2. 每次移动张数不限
  3. 移动次数不限
  4. 求最小移动张数

借鉴于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]|的最小值,取中位数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值