เราได้รับตู้เซฟสองตู้ คือ L1 และ L2 ที่มีเงินในรูปเหรียญ L1 มีเหรียญ A เหรียญ และ L2 มีเหรียญ B เหรียญ เราต้องถอนเงินหรือเหรียญจากตู้เซฟให้ได้เงินสูงสุด ทุกครั้งที่ถอนเหรียญจากตู้ใดตู้หนึ่ง จะถูกแทนที่ด้วยเหรียญน้อยกว่าจำนวนเดิม 1 เหรียญ หากถอน A เหรียญจาก L1 จะถูกแทนที่ด้วย A-1 เหรียญ และหากถอน B เหรียญจาก L2 จะถูกแทนที่ด้วย B-1 เหรียญ งานคือเพิ่มเงินที่ถอนได้สูงสุดในสองขั้นตอน นั่นคือสามารถถอนได้เพียงสองครั้งเท่านั้น
ตัวอย่าง
อินพุต — L1: 10, L2: 11
เอาต์พุต — เงินสูงสุดที่ถอนได้ในสองขั้นตอน — 21
คำอธิบาย — ขั้นตอนที่ 1 ถอน 11 เหรียญจาก L2, L2 จะกลายเป็น 11-1=10 เหรียญ
ขั้นตอนที่ 2 L1 และ L2 ทั้งคู่มี 10 เหรียญ จึงถอนจากตู้ไหนก็ได้ และเรามี 11+10=21 เหรียญ ซึ่งเป็นค่าสูงสุด
อินพุต — L1: 5, L2: 5
เอาต์พุต — เงินสูงสุดที่ถอนได้ในสองขั้นตอน — 10
วิธีการที่ใช้ในโปรแกรม
- มีตู้เซฟ L1 และ L2 เป็นจำนวนเต็มที่มีเหรียญ
- ฟังก์ชัน maxMoney(int A, int B) รับจำนวนเหรียญในตู้เซฟ
- ใน maxMoney() ใช้ตัวแปร 'money' เก็บจำนวนเงินสูงสุด
- เริ่มต้น money รับค่าจาก A หรือ B ตัวไหนมากกว่า (money = A > B ? A : B)
- เปรียบเทียบค่า money กับ A หรือ B เพื่อเช็คว่าถอนจากตู้ไหน
- แทนที่ตู้นั้นด้วยจำนวนน้อยกว่าเดิม 1 (A-- หรือ B--)
- อีกครั้ง money จะบวกค่าจาก A หรือ B ตัวไหนมากกว่า (money += A > B ? A : B)
ตัวอย่างโค้ด
#include <stdio.h>
#include <math.h>
// ฟังก์ชันคืนค่าเหรียญสูงสุดที่ได้
int maxMoney(int A, int B) {
// ถอนเหรียญ
int money = A > B ? A : B;
// เติมตู้เซฟด้วยเหรียญน้อยกว่า 1
if (money == A)
A--;
else
B--;
// ถอนอีกครั้ง
money += A > B ? A : B;
return money;
}
// โค้ดหลัก
int main() {
int L1 = 8, L2 = 9;
printf("เงินสูงสุดที่ถอนได้ในสองขั้นตอน: %d", maxMoney(L1, L2));
return 0;
}
ผลลัพธ์
หากรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ —
เงินสูงสุดที่ถอนได้ในสองขั้นตอน: 17