超级洗衣机

假设有 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。

每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。

给定一个非负整数数组代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的最少的操作步数。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。

示例 1:

输入: [1,0,5]

输出: 3

解释:

第一步: 1 0 <-- 5 => 1 1 4

第二步: 1 <-- 1 <-- 4 => 2 1 3

第三步: 2 1 <-- 3 => 2 2 2

示例 2:

输入: [0,3,0]

输出: 2

解释:

第一步: 0 <-- 3 0 => 1 2 0

第二步: 1 2 --> 0 => 1 1 1

示例 3:

输入: [0,2,0]

输出: -1

解释:

不可能让所有三个洗衣机同时剩下相同数量的衣物。

提示:

  1. n 的范围是 [1, 10000]。
  2. 在每台超级洗衣机中,衣物数量的范围是 [0, 1e5]。

算法

(线性遍历,答案分解) O(n)

由于每次操作每台洗衣机只能选择向左或者向右运送一件衣服,且多个洗衣机可以并行同时运送,故必定存在一个洗衣机,它运送的衣服数量等于答案。

我们可以枚举每一台洗衣机,计算经过它运送的衣服的数量。

首先如果衣服的总数量是洗衣机的整数倍,则必定存在一个解;否则返回 -1。

然后逐一枚举洗衣机,假设当前枚举的洗衣机编号为 i,则统计 left_sum = [0, i - 1] 中衣服的总数量和 right_sum = [i + 1, n - 1] 中衣服的总数量,若发现 left_sum < i * avg,即 i 左边的衣服数量少,故需要经过这台洗衣机从右向左运送的衣服数量为 r_2_l = i * avg - left_sum。从左向右运行的衣服数量 l_2_r 同理。

r_2_l + l_2_r 求和就是这台洗衣机的工作量,对每一台洗衣机都这样求和得到工作量,取工作量最大的洗衣机就是答案。

#include<vector>

#include<algorithm>

using namespace std;

class Solution {

public:

int findMinMoves(vector<int>& machines) {

int n = machines.size(), ans = 0;

int tot = accumulate(machines.begin(), machines.end(), 0);

if (tot % n != 0) return -1;

int avg = tot / n;

int right_sum = tot, left_sum = 0;

for (int i = 0; i < n; i++) {

right_sum -= machines[i];

int r_2_l = max(i * avg - left_sum, 0);

int l_2_r = max((n - i - 1) * avg - right_sum, 0);

ans = max(ans, l_2_r + r_2_l);

left_sum += machines[i];

}

return ans;

}

};

Leetcode 517.超级洗衣机的更多相关文章

  1. Java实现 LeetCode 517 超级洗衣机

    517. 超级洗衣机 假设有 n 台超级洗衣机放在同一排上.开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的. 在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,与此同时将 ...

  2. [Swift]LeetCode517. 超级洗衣机 | Super Washing Machines

    You have n super washing machines on a line. Initially, each washing machine has some dresses or is ...

  3. C#版(击败100.00%的提交) - Leetcode 372. 超级次方 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. Leetcod ...

  4. [LeetCode] Super Washing Machines 超级洗衣机

    You have n super washing machines on a line. Initially, each washing machine has some dresses or is ...

  5. 517 Super Washing Machines 超级洗衣机

    详见:https://leetcode.com/problems/super-washing-machines/description/ C++: class Solution { public: i ...

  6. Leetcode - 517 Super Washing Machines

    今天开始定期记录本人在leetcode上刷题时遇到的有意思的题目.   517. Super Washing Machines   You have n super washing machines ...

  7. Leetcode 372.超级次方

    超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: 输入: a ...

  8. Leetcode 313.超级丑数

    超级丑数 编写一段程序来查找第n个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7,13,19] ...

  9. Java实现 LeetCode 372 超级次方

    372. 超级次方 你的任务是计算 ab 对 1337 取模,a 是一个正整数,b 是一个非常大的正整数且会以数组形式给出. 示例 1: 输入: a = 2, b = [3] 输出: 8 示例 2: ...

随机推荐

  1. codevs 2620 战壕

    时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description Smart和Sarah正在玩一个即时战略游戏. Smart在他的基地附近建立了n个 ...

  2. 页面中插入视频兼容ie8以上的浏览器

    有时候页面中需要插入视频,如果不考虑ie8的话:就是直接用h5标签<video></video>就可以了: 但是有的时候需求是需要考虑ie8,这样我们就可以用插件,这种vide ...

  3. HDU3973 线段树 + 字符哈希

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3973 , 线段树 + 字符哈希,好题. 又学了一种新的哈希方法,hhhh~ 解法: 想法是用P进制的数 ...

  4. cesium 加载TMS影像(已经切片)

    TMS影像数据格式 加载影像的代码: var layers = viewer.scene.imageryLayers; var blackMarble = layers.addImageryProvi ...

  5. 碰到一个微软的bug:CWinAppEx::GetString

    在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了MFC框架所以,为了简化代码直接使用了CWinAppEx::GetString .CWinAppEx::SetS ...

  6. <已解决>使用selector设置Button按下松开的样式以及 <item> tag requires a 'drawable' attribute or child tag defining a drawable 报错

    <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="ht ...

  7. 如果int x=20, y=5,则语句System.out.println(x+y +""+(x+y)+y); 的输出结果是()

    答案是25255 小括号优先级高,所以先算小括号内的x+y=25 然后再算前面的x+y=25 但是中间有个空的字符串,java会把这个空字符串后面的都当成字符串看待,所以结果是25255

  8. Java中的异常处理从概念到实例

    1.概念 采用新的异常处理机制 在以往的程序开发过程中,经常采用返回值进行处理.例如,在编写一个方法,可以返回一个状态代码,调用者根据状态代码判定出错与否.若状态代码表示一个错误,则调用这进行相应的处 ...

  9. POI Excel 插入新的行,下面的行动态移动

    在做Excel 模板时,会有遇到  模板行数不固定,如下图  需要在行次4下面再插入一行:注意:(插入的行如果是下面空白行,需要创建行) 解决方法是使用shifRows方法,第1个参数是指要开始插入的 ...

  10. 安装并配置多实例Mysql数据库

    1.安装Mysql需要的依赖包 yum -y install ncurses-devel libaio-devel cmake 2.创建Mysql用户账号 useradd -s /sbin/nolog ...