ภารกิจคือการคำนวณจำนวนสูงสุดของกลุ่มขนาด 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