[leetcode]Super Washing Machines
来源:互联网 发布:农产品直销网络 编辑:程序博客网 时间:2024/06/05 15:03
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: 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].
The proof of this algorithm is from here.
Say wash machines are with dresses:
Theorem: The minimum number of moves to even all wash machines
proof:
First we need construct a sequence of
while M > 0: for each wash machine: if f[i] < M: do nothing else: if R[i] > 0: move one dress to its right else: move one dress to its left recompute M based on current configuration
In each loop, M will decrease by one because those with
if
Lemma1: in previous constructing process,
pf:
assume
if
if
Thus,
Since in every loop, machines with
*Lemma2:if
pf by contradiction:
Assume
if
this means both sides lack dress to fill to reach even, this is impossible.
if
because
if
because
C++ solution:
int findMinMoves(vector<int>& machines) { int len = machines.size(); vector<int> sums(len + 1, 0); for (int i = 1; i <= len; ++i) sums[i] = sums[i - 1] + machines[i - 1]; if (sums[len] % len) return -1; int average = sums[len] / len, ans = 0; for (int i = 0; i < len; ++i) { int L = max(average * i - sums[i], 0); int R = max((len - i - 1) * average - (sums[len] - sums[i + 1]), 0); ans = max(ans, L + R); } return ans;}
- [leetcode]Super Washing Machines
- 【Leetcode】517. Super Washing Machines
- [leetcode] 517. Super Washing Machines
- LeetCode 517. Super Washing Machines
- [LeetCode OJ]Super Washing Machines
- LeetCode[517] Super Washing Machines
- LeetCode 517. Super Washing Machines
- 【LeetCode】517. Super Washing Machines
- LeetCode 517 Super Washing Machines
- [leetcode]517. Super Washing Machines
- Leetcode 517. Super Washing Machines
- LeetCode 517. Super Washing Machines
- [Leetcode] 517. Super Washing Machines 解题报告
- leetcode 517. Super Washing Machines 超级洗衣机
- Super Washing Machines
- 517.Super Washing Machines
- 517.Super Washing Machines
- 517. Super Washing Machines
- H5开发:搭建 AngularJS+Ionic+Cordova 开发环境
- echarts圆环百分比图示
- 获得InputStream,读取配置文件的方式
- 【C++】LeetCode 85. Maximal Rectangle
- Struts 下载,上传
- [leetcode]Super Washing Machines
- Struts2学习笔记
- C++11 图说VS2013下的引用叠加规则和模板参数类型推导规则
- squid
- 总结一下遇到的各种核函数~
- C++string中用于查找的find系列函数浅析
- PHP那些琐碎的知识点
- 对 jquery bind on 事件的理解
- hadoop 安装与环境搭建