leetcode 517 超级洗衣机 求最大流量

本题要求的是任选m台洗衣机
本题要求最小的移动次数,肯定每次的移动都是为了多的往少的移动 可以是一次从多的往少的移动,也可以经过一个或多个中转站往少的移动。
这样差值就有这样两种情况
(2,-3,1,-4,6,-2) 因为允许并行,所以移动次数是由最多的那堆衣服决定,每次都是差值为正的那些洗衣机并行操作。
还有种情况(4,2,-6) 因为选择的m个洗衣机可以包含连续的洗衣机,那中间部分的洗衣机只起到了过渡作用,如果这些起过渡作用的洗衣机也是需要往外面移出的话 就不能和最大差值的那个洗衣机并行操作了。这时候若考虑前缀和比如(4,2,-6)->
(4,6,0),4和2的前缀和是6,就意味着它们需要向后面移动6件衣服,也就需要6次
(2,-3,4,2,-6,-2,3)也是如此 所以需要考虑前缀和
官方题解

为什么都是求max呢?
第一个值得max很好理解因为是最大得差值
第二个的max是为了保证所有的衣服都能平衡,比如上个例子种的4,2,-6这三个
本质是求最大的"流量"

因为只能往相邻方向传衣服 所以要分个组(考虑只能选1台洗衣机的情况)

int findMinMoves(int* machines, int machinesSize){
    int sum=0;
    for(int i=0;i<machinesSize;i++)
    {
        sum+=machines[i];
    }
    if(sum % machinesSize)
    return -1;

    int avg = sum / machinesSize;
    int ans=-1;
    int presum=0;
    for(int i = 0;i < machinesSize; i ++)
    {
       presum+=machines[i]-avg;
       ans=fmax(ans,fmax(abs(presum),machines[i]-avg));
    }
    return ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值