均分纸牌

均分纸牌

贪心算法求解:(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。即不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。

问题:N堆纸牌,纸牌总数是N的整数倍,求解给定情况下最少移动次数使得每堆纸牌数目相同。

如何移动最小步骤实现完成当前堆牌数等于均值,那就是从邻近堆借牌,
在借牌时产生的负数(即贷款)问题,说明邻近堆牌数不足,需要从远处借调(这是恰恰要省略的一步);
把多于均值的理解为高处,把小于均值的理解为低处,在牌从高处走向低处时,
如果有重复移动,如a,b,c相邻,b堆移动1张到c堆,a堆移动3张到b堆再从b到c堆,
b堆到c堆移动了两次牌,这种情况是可以避免的,即先由a堆移动3张到b,再由b移动1张到c,
移动产生负数的问题等价于上面第一种情况,说明需要至少两次移动,而这种移动可以简化到一次移动,
其实n堆牌,最少的移动次数最大是n-1;
可以使用贪心算法的关键在于从同一方向到某个点的多次移动可以简化成一次移动

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,card[105],ave,step;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%d",&card[i]),ave+=card[i];
    ave=ave/n;
    for(int i=1;i<=n;++i)
    {
        if(ave==card[i]) continue;
        card[i+1]+=card[i]-ave,step++;
    }
    printf("%d\n",step);
    return 0;
}

小白上路,各位老爷勿喷。参考地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值