สมมุติว่าเรามีเครื่องซักผ้าซุปเปอร์อยู่ติดกัน ในขั้นต้น เครื่องซักผ้าแต่ละเครื่องมีชุดหรือว่างเปล่า สำหรับการย้ายแต่ละครั้ง เราสามารถเลือกเครื่องซักผ้า m (1 ≤ m ≤ n) ใดๆ และส่งเสื้อผ้าหนึ่งชุดของเครื่องซักผ้าแต่ละเครื่องไปยังเครื่องซักผ้าเครื่องใดเครื่องหนึ่งที่อยู่ติดกันได้พร้อมกัน สมมติว่าเรามีอาร์เรย์จำนวนเต็มหนึ่งชุดที่แสดงจำนวนชุดในเครื่องซักผ้าแต่ละเครื่องจากซ้ายไปขวาในแถว เราควรหาจำนวนการเคลื่อนไหวขั้นต่ำเพื่อให้เครื่องซักผ้าทั้งหมดมีจำนวนเสื้อผ้าเท่ากัน หากทำไม่ได้ ให้คืนค่า -1
ดังนั้นเมื่ออินพุตเป็น [1,0,5] เอาต์พุตจะเป็น 3 เนื่องจากส่ง 5 ถึง 0 ดังนั้นการกระจายจะเป็น [1, 1, 4] จากนั้นกลาง 1 ไปทางซ้าย 1 ไปที่ 1 แล้วจะกลายเป็น [2,1,3] จากนั้นเป็น 2 ต่อ 1 ในที่สุดก็เป็น [2,2,2]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- sum :=ผลรวมขององค์ประกอบทั้งหมดของ v
- n :=ขนาดของวี
- ถ้า sum mod n ไม่เท่ากับ 0 แล้ว −
- คืน -1
- req :=sum / n, ret :=0, extra :=0
- สำหรับการเริ่มต้น i :=0 เมื่อฉัน
- x :=v[i]
- พิเศษ :=พิเศษ + (x - req)
- 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