สมมติว่าเรามีอาร์เรย์ A ที่มีองค์ประกอบ n มีนักเรียน n กลุ่ม กลุ่มคือคนเดียวที่สามารถเขียนรหัสกับคนอื่นหรือสองคนที่ต้องการเขียนรหัสในทีมเดียวกัน แต่พี่เลี้ยงตัดสินใจตั้งทีมสามคนพอดี เราต้องหาจำนวนทีมสูงสุดสามคนที่พี่เลี้ยงสามารถสร้างขึ้นได้ สำหรับกลุ่มที่มี 2 คน นักเรียนทั้งสองควรเขียนโค้ด หรือไม่ก็ไม่ควรทั้งคู่ หากนักเรียนสองคนจากกลุ่มละสองคนจะเขียนโค้ด พวกเขาควรอยู่ทีมเดียวกัน
ดังนั้นหากอินพุตเป็นเหมือน A =[2, 2, 2, 1, 1, 1, 1] ผลลัพธ์จะเป็น 3 เพราะพี่เลี้ยงสามารถสร้างทีมได้เช่น:[กลุ่มแรกสองคนและกลุ่มที่เจ็ด ของหนึ่งคน], [กลุ่มที่สองของสองคนและกลุ่มที่หกของหนึ่งคน], [กลุ่มที่สามของสองคนและกลุ่มที่สี่ของหนึ่งคน].
ขั้นตอน
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
p := 0 q := 0 x := size of A for initialize i := 0, when i < x, update (increase i by 1), do: a := A[i] if a is same as 1, then: p := p + 1 Otherwise q := q + 1 if p > q, then: return q + (p - q) otherwise when p < q, then: return p Otherwise return p
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; int solve(vector<int> A){ int p = 0, q = 0; int x = A.size(); for (int i = 0; i < x; i++){ int a = A[i]; if (a == 1){ p = p + 1; } else{ q = q + 1; } } if (p > q){ return q + (p - q) / 3; } else if (p < q){ return p; } else{ return p; } } int main(){ vector<int> A = { 2, 2, 2, 1, 1, 1, 1 }; cout << solve(A) << endl; }
อินพุต
{ 2, 2, 2, 1, 1, 1, 1 }
ผลลัพธ์
3