Topic link: Super Washing Machines
- Title Description:
You have n super washing machines on a line. Initially, each washing machine has some dresses or is empty.
For each move, you could choose any m (1 ≤ m ≤ n) washing machines, and pass one dress of each washing machine to one of its adjacent washing machines at the same time .
Given an integer array representing the number of dresses in each washing machine from left to right on the line, you should find the minimum number of moves to make all the washing machines have the same number of dresses. If it is not possible to do it, return -1.
Example1
Input: [1,0,5]
Output: 3
Explanation:
1st move: 1 0 <-- 5 => 1 1 4
2nd move: 1 <-- 1 <-- 4 => 2 1 3
3rd move: 2 1 <-- 3 => 2 2 2
Example2
Input: [0,3,0]
Output: 2
Explanation:
1st move: 0 <-- 3 0 => 1 2 0
2nd move: 1 2 --> 0 => 1 1 1
Example3
Input: [0,2,0]
Output: -1
Explanation:
It's impossible to make all the three washing machines have the same number of dresses.
Note:
The range of n is [1, 10000].
The range of dresses number in a super washing machine is [0, 1e5].
(1) Ideas: First of all, judge whether the average can be achieved. Then it should be noted that many washing machines pass a piece of clothing in one direction at the same time, and the number of steps counts only once. It only needs variables to record the difference between the current quantity and the average result quantity of each position. Negative number represents the number of steps moving from left, positive number is the number of steps moving from right, and absolute value is the minimum number of steps moving. If there are already four clothes to be transferred through this washing machine, and there are two more clothes, then there are six clothes to be transferred, totaling seven steps. Record the maximum in real time with a variable. After traversing all the elements in the array and maximizing them, the real minimum number of steps can be obtained.
(2) code:
class Solution {
public:
int findMinMoves(vector<int>& machines) {
int sum = 0, size = machines.size();
for (int i = 0; i < size; ++i)
sum += machines[i];
if (sum % size != 0)
return -1;
int tar = sum / size, total = 0, bal = 0;
for (int i = 0; i < size; ++i) {
bal += machines[i] - tar;
total = max(total, max(machines[i] - tar, abs(bal)));
}
return total;
}
};