คำชี้แจงปัญหา
จากอาร์เรย์ขนาด n ภารกิจคือการหาจำนวนขั้นตอนขั้นต่ำที่จำเป็นในการทำให้องค์ประกอบทั้งหมดของอาร์เรย์หารด้วย 4 ลงตัว ขั้นตอนหนึ่งหมายถึงการลบองค์ประกอบสององค์ประกอบออกจากอาร์เรย์และเพิ่มผลรวมขององค์ประกอบเหล่านี้ ไปยังอาร์เรย์
ตัวอย่าง
หากอาร์เรย์อินพุตเป็น {1, 2, 0, 2, 4, 3} จำเป็นต้องมีการดำเนินการ 3 ครั้ง -
1 + 3 =42 + 2 =40 + 4 =4
อัลกอริทึม
<ก่อน>1. ผลรวมของอิลิเมนต์ทั้งหมดของอาร์เรย์ควรหารด้วย ถ้าไม่ใช่ งานนี้จะไม่สามารถทำได้2 เริ่มต้นอาร์เรย์คือโมดูลัสขนาด 4 ถึง 03 เริ่มต้นตัวนับเป็น 0 จะติดตามจำนวนขั้นตอนที่เสร็จสิ้น4 สำรวจผ่านอาร์เรย์อินพุตและรับโมดูลัส 4 ของแต่ละองค์ประกอบ5 เพิ่มค่าของค่า mod 4 ในอาร์เรย์โมดูลัสขึ้น 16 โมดูลัส[0] คือการนับองค์ประกอบที่หารด้วย 4 ลงตัวแล้ว ดังนั้นไม่จำเป็นต้องจับคู่กับองค์ประกอบอื่นๆ7 องค์ประกอบโมดูลัส[1] และโมดูลัส[3] สามารถรวมกันได้เพื่อให้ได้จำนวนที่หารด้วย 4 ลงตัว ดังนั้น การเพิ่มขึ้นนับเป็นค่าต่ำสุดของทั้งคู่8 ทุกๆ 2 องค์ประกอบของโมดูลัส[2] สามารถรวมกันเพื่อให้ได้องค์ประกอบที่หารด้วย 4.9 ลงตัว สำหรับองค์ประกอบที่เหลือ เพิ่มค่าโมดูลัส[2] โดยครึ่งหนึ่งของโมดูลัส[1] และโมดูลัส[3].10 ตอนนี้ นับการเพิ่มทีละครึ่งโมดูล[2] เราใช้ครึ่งหนึ่งเพราะทุกสององค์ประกอบรวมกันเป็นหนึ่ง11 ค่าสุดท้ายของการนับคือจำนวนขั้นตอนที่จำเป็นในการแปลงองค์ประกอบทั้งหมดของอาร์เรย์อินพุตที่หารด้วย 4 ลงตัวตัวอย่าง
#includeใช้เนมสเปซ std;int getMinRequiredSteps(int arr[], int n) { จำนวน int =0; โมดูลัส int[4] ={0}; ผลรวม int =0; สำหรับ (int i =0; i โมดูลัส[3]) { นับ +=โมดูลัส[3]; } อื่น ๆ { นับ +=โมดูลัส[1]; } โมดูลัส[1] -=นับ; โมดูลัส[3] -=นับ; โมดูลัส[2] +=โมดูลัส[1] / 2; โมดูลัส[2] +=โมดูลัส[3] / 2; นับ +=โมดูลัส [1] / 2; นับ +=โมดูลัส[3] / 2; นับ +=โมดูลัส[2] / 2; นับกลับ; }}int main() { int arr[] ={1, 2, 0, 2, 4, 3}; int n =sizeof(arr) / sizeof(arr[0]); cout <<"ขั้นตอนที่จำเป็นขั้นต่ำ =" < เมื่อคุณคอมไพล์และรันโปรแกรมข้างต้น มันสร้างผลลัพธ์ดังต่อไปนี้
ผลลัพธ์
ขั้นตอนที่จำเป็นขั้นต่ำ =2