สมมุติว่าเรากำลังเล่นเกม Guess คุณสมบัติของเกมนี้มีดังนี้ -
ผู้เล่น 1 จะเลือกตัวเลขตั้งแต่ 1 ถึง n ผู้เล่น 2 ต้องเดาว่าผมเลือกหมายเลขอะไร ทุกครั้งที่ผู้เล่น2เดาผิด ผู้เล่น1จะบอกผู้เล่น2ว่าตัวเลขสูงหรือต่ำ
เราสามารถใช้ฟังก์ชัน Guess(num) ซึ่งจะให้ผลลัพธ์ที่เป็นไปได้ 3 แบบดังนี้ −
-
-1 - ผู้เล่นหมายเลข 1 ต่ำกว่า
-
1 - ผู้เล่นหมายเลข 1 สูงกว่า
-
0 - ตัวเลขตรงกัน
ดังนั้น หากอินพุตเท่ากับ n =10 เลือก =5 ผลลัพธ์จะเป็น 5
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
ล :=1,r :=น
-
ในขณะที่ l −=r ทำ −
-
m :=l+(r - l)/2
-
ถ้า Guess(m) เท่ากับ 0 แล้ว −
-
กลับม
-
-
ถ้า Guess(m) เหมือนกับ -1 แล้ว −
-
r :=m - 1
-
-
มิฉะนั้น
-
l :=m + 1
-
-
-
คืนค่า 0
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class Solution { private: int number; int guess(int num){ if(number > num) return 1; if(number < num) return -1; return 0; } public: Solution(int n){ number = n; } int guessNumber(int n) { int l=1,r=n,m; while(l<=r){ m=l+(r-l)/2; if(guess(m)==0) return m; if(guess(m)==-1) r=m-1; else l=m+1; } return 0; } }; main(){ Solution ob(5); //pick = 5 cout << (ob.guessNumber(10)); }
อินพุต
5,10
ผลลัพธ์
5