n개의 슈퍼 세탁기가 한 줄에 있다고 가정해 봅시다. 처음에는 각 세탁기에 드레스가 있거나 비어 있습니다. 이제 각 이동에 대해 m(1 ≤ m ≤ n) 세탁기를 선택하고 각 세탁기의 드레스 하나를 인접한 세탁기 중 하나로 전달할 수 있습니다. 행의 왼쪽에서 오른쪽으로 각 세탁기의 드레스 수를 나타내는 하나의 정수 배열이 있다고 가정하면 모든 세탁기가 동일한 수의 옷을 갖도록 최소 이동 수를 찾아야 합니다. 할 수 없으면 -1을 반환합니다.
따라서 입력이 [1,0,5]와 같을 때 출력은 3이 됩니다. 이것은 5를 0으로 보내기 때문이므로 분포는 [1, 1, 4]가 되고 중간 1에서 왼쪽 1, 4가 됩니다. 1로 변경하면 [2,1,3]이 되고 2에서 1이 되므로 마지막으로 [2,2,2]
가 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- sum :=v의 모든 요소의 합
- n :=v의 크기
- 합계 mod n이 0이 아닌 경우 -
- 반환 -1
- req :=합계 / n, ret :=0, 추가 :=0
- 초기화 i의 경우:=0, i
- x :=v[i]
- 추가 :=추가 + (x - 필수)
- ret :=최대 {ret, x - req, |extra|
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> using namespace std; class Solution { public: int findMinMoves(vector<int>& v) { int sum = accumulate(v.begin(), v.end(), 0); int n = v.size(); if(sum % n != 0) return -1; int req = sum / n; int ret = 0; int extra = 0; for(int i = 0; i < n; i++){ int x = v[i]; extra +=( x - req); ret = max({ret, x - req, abs(extra)}); } return ret; } }; main(){ Solution ob; vector<int> v = {2,1,6}; cout << (ob.findMinMoves(v)); }
입력
{2,1,6}
출력
3