## 517. Super Washing Machines

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:3Explanation: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:2Explanation:1st move: 0 <-- 3 0 => 1 2 0 2nd move: 1 2 --> 0 => 1 1 1

**Example3**

Input:[0,2,0]Output:-1Explanation: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].

## Rust Solution

```
struct Solution;
impl Solution {
fn find_min_moves(machines: Vec<i32>) -> i32 {
let n = machines.len();
let sum: i32 = machines.iter().sum();
if sum % n as i32 != 0 {
return -1;
}
let avg = sum / n as i32;
let mut res = 0;
let mut count = 0;
for i in (1..n).rev() {
let diff = machines[i] - avg;
res = res.max(diff);
count += diff;
res = res.max(count.abs());
}
res
}
}
#[test]
fn test() {
let machines = vec![1, 0, 5];
let res = 3;
assert_eq!(Solution::find_min_moves(machines), res);
let machines = vec![0, 3, 0];
let res = 2;
assert_eq!(Solution::find_min_moves(machines), res);
let machines = vec![0, 2, 0];
let res = -1;
assert_eq!(Solution::find_min_moves(machines), res);
}
```

Having problems with this solution? Click here to submit an issue on github.