ภารกิจคือการคำนวณจำนวนสูงสุดของกลุ่มขนาด 3 ที่สามารถเกิดขึ้นได้เมื่อ N จำนวนรายการประเภท A และ M จำนวนรายการประเภท Bพี>
นอกจากนี้ แต่ละกลุ่มควรมีอย่างน้อยหนึ่งรายการในแต่ละประเภท นั่นคือ A หรือ B
ตอนนี้มาทำความเข้าใจสิ่งที่เราต้องทำโดยใช้ตัวอย่าง -
ป้อนข้อมูล − N=3, M=5
ป้อนข้อมูล − 2
คำอธิบาย
Group 1: 1 item of type A and 2 items of type B Group 2: 1 item of type A and 2 items of type B In total, 2 items of type A and 4 items of type B are used.
ป้อนข้อมูล − N=5, M=9
ป้อนข้อมูล − 4
แนวทางที่ใช้ในโปรแกรมด้านล่างดังนี้
-
สถานการณ์ต่อไปนี้สามารถแบ่งออกเป็น 4 กรณี -
-
กรณีที่ 1 −
เมื่อ M>=2N จำนวนกลุ่มสูงสุดที่เป็นไปได้ =M
-
กรณีที่ 2 −
เมื่อ N>=2M จำนวนกลุ่มสูงสุดที่เป็นไปได้ =N
-
กรณีที่ 3 −
เมื่อ (M+N) % 3 ==0 ดังนั้นจำนวนกลุ่มสูงสุดที่เป็นไปได้ =(M+N)/3
-
กรณีที่ 4 −
เมื่อไม่มีเงื่อนไขข้างต้นเป็นจริง จำนวนกรณีสูงสุดจะกลายเป็น (M+N)/3 + (กลุ่มใด ๆ ที่เหลือ)
หากต้องการตรวจสอบว่ามีกลุ่มใดเหลืออยู่ ให้ตั้งค่า N=N%3 และ M=M%3 เพื่อรับรายการที่เหลือของทั้งสองประเภท จากนั้นตรวจสอบโดยใช้เงื่อนไขต่อไปนี้ -
ถ้า ( N!=0 &&M!=0 &&(N+M)>=3)
หากเงื่อนไขข้างต้นเป็นจริง ให้บวก 1 เข้ากับผลลัพธ์สุดท้าย
-
-
ในฟังก์ชัน MaxGrp() โดยใช้ if condition ตรวจสอบกรณีข้างต้น
-
ถ้า( M>=2*N ) เป็นจริง ให้คืนค่า M เป็นคำตอบ อื่น ถ้า( N>=2*M ) เป็นจริง ให้คืนค่า N เป็นคำตอบ
-
หากเงื่อนไขทั้งสองข้างต้นไม่เป็นความจริง ให้ตรวจสอบว่า ( (M + N)%3 ==0 ) หากเป็นจริงให้คืนค่า (M + N)/3 เป็นคำตอบ
-
หากไม่มีเงื่อนไขข้างต้นเป็นจริง ให้เริ่มต้นตัวแปร count =(M + N)/3 ของประเภท int
ใส่ N=N%3 และ M=M%3 แล้วตรวจสอบกลุ่มที่เหลือโดยใช้เงื่อนไขที่ระบุไว้ข้างต้นในกรณีที่ 4 หากเงื่อนไขเป็นจริง ให้เพิ่ม 1 เพื่อนับและส่งคืนคำตอบ
ตัวอย่าง
#include<bits/stdc++.h> using namespace std; // Implements above mentioned steps. int MaxGrp(int N, int M){ if (N >= 2 * M) return N; if (M >= 2 * N) return M; if ((M + N) % 3 == 0) return (M + N)/3; int count = (M + N)/3; M %= 3; N %= 3; if (M && N && (M + N) >= 3) count++; return count; } int main(){ int N = 5, M = 9; cout << MaxGrp(N, M); return 0; }
ผลลัพธ์
หากเราเรียกใช้โค้ดข้างต้น เราจะได้ผลลัพธ์ดังต่อไปนี้ -
4