ในปัญหานี้ เราได้รับค่าจำนวนเต็มสามค่า A , B และ T งานของเราคือสร้างโปรแกรมเพื่อเล่น เกมผลัดกันคี่ที่มีจำนวนเต็มสองจำนวน
ค่าจำนวนเต็มสองค่าคือ :
T หมายถึงจำนวนรอบในเกม
A หมายถึงค่าสำหรับผู้เล่น1
B หมายถึงค่าสำหรับผู้เล่น2
ถ้าค่าของ T เป็นเลขคี่ ค่าของ A จะถูกคูณด้วย 2
ถ้าค่าของ T เป็นคู่ ค่าของ B จะถูกคูณด้วย 2
ต้องหาค่ากลับมาเป็น max(A, B) / min(A, B) ในตอนท้าย
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: A =3, B =4, T =3
ผลลัพธ์: 1
คำอธิบาย:
เทิร์นแรก :T เป็นเลขคี่, A คูณด้วย 2, A =6
เทิร์นที่ 2:T เป็นคู่ B คูณด้วย 2, B =8
เทิร์นที่ 3:T เป็นเลขคี่ A คูณด้วย 2, A =12
A =12 B =4
สูงสุด (A, B) =สูงสุด (12, 4) =12
นาที (A, B) =นาที (12, 4) =4
สูงสุด (A, B) / นาที (A, B) =12/8 =1
แนวทางแก้ไข:
วิธีแก้ปัญหาอย่างง่ายคือการคำนวณค่าของ A และ B หลังจาก T เลี้ยวแล้วคืนค่า max(A, B) / นาที (A, B) นี่เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพโดยการทำซ้ำ T
แต่อาจเป็นวิธีแก้ปัญหาที่มีประสิทธิภาพมากกว่าโดยพิจารณาจากข้อเท็จจริงที่ว่าสำหรับค่า T ที่เท่ากัน ค่าของ A ใหม่คือ N*A และค่าของ B ใหม่คือ N*B
ทำให้ค่าของ max(A, B) / min(A, B) เป็นค่าคงที่ซึ่งเท่ากับ
สูงสุด (A, B) / นาที (A, B)
หากค่าของ T เป็นเลขคี่ ค่าของ A จะเป็น 2*N*A และค่าของ B คือ N*B
ทำให้ค่าของ max(A, B) / min(A, B) เป็นค่าคงที่ซึ่งเท่ากับ max(2A, B) / min(2A, B)
ผลลัพธ์ของปัญหา max(A, B) / min(A, B) =
สูงสุด(A, B) / นาที (A, B) ถ้า T เป็นคู่
สูงสุด (A, B) / นาที (A, B) ถ้า T เป็นเลขคี่
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <iostream> using namespace std; int EvenOddGame(int A, int B, int T) { if ( T%2 == 0) return (max(A, B) / min(A, B)); else return (max(2*A, B) / min(2*A, B)); return -1; } int main() { int A = 3, B = 2, T = 3; cout<<"The return value of even odd game is "<<EvenOddGame(A, B, T); }
ผลลัพธ์ -
The return value of even odd game is 3