zoukankan      html  css  js  c++  java
  • 517. 超级洗衣机 贪心

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

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

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

    示例 1:

    输入:machines = [1,0,5]
    输出:3
    解释:
    第一步: 1 0 <-- 5 => 1 1 4
    第二步: 1 <-- 1 <-- 4 => 2 1 3
    第三步: 2 1 <-- 3 => 2 2 2

    解题思路: 有四个洗衣机,装的衣服数为[0, 0, 11, 5],最终的状态会变为[4, 4, 4, 4],那么我们将二者做差,得到[-4, -4, 7, 1],这里负数表示当前洗衣机还需要的衣服数,正数表示当前洗衣机多余的衣服数。我们要做的是要将这个差值数组每一项都变为0,对于第一个洗衣机来说,需要四件衣服可以从第二个洗衣机获得,那么就可以 把-4移给二号洗衣机,那么差值数组变为[0, -8, 7, 1],此时二号洗衣机需要八件衣服,那么至少需要移动8次。然后二号洗衣机把这八件衣服从三号洗衣机处获得,那么差值数组变为[0, 0, -1, 1],此时三号洗衣机还缺1件,就从四号洗衣机处获得,此时差值数组成功变为了[0, 0, 0, 0],成功。那么移动的最大次数就是差值 数组中出现的绝对值最大的数字,8次

    class Solution {
    public:
        int findMinMoves(vector<int>& machines) {
            int tot = 0;
            for (int machine : machines) {
                tot += machine;
            }
    
            int n = machines.size();
            if (tot % n != 0) {
                return -1;
            }
            int avg = tot / n;
    
            vector<int> helper(n);
            for (int i = 0; i < n; i++) {
                helper[i] = machines[i] - avg;
            }
    
            int ans = INT_MIN;
            for (int i = 0; i < n - 1; i++) {
                ans = max(ans, abs(helper[i]));
                ans = max(ans, helper[i + 1]);
                helper[i + 1] += helper[i];
            }
    
            return max(ans, helper[n - 1]);
        }
    };
    
  • 相关阅读:
    获取屏幕分辨率
    String-去除-指定-字符-操作
    Log4j配置详述
    Java-String-数据乱码
    javascript高级课程-3
    javascript高级课程-2
    javascript高级课程-1
    设计一个算法双链表删除重复
    设计一个算法将一个顺序表逆置
    w3c标准
  • 原文地址:https://www.cnblogs.com/xgbt/p/15351185.html
Copyright © 2011-2022 走看看