Giả sử chúng ta đang chơi Trò chơi Đoán. Các thuộc tính của trò chơi này như sau -
Người chơi 1 sẽ chọn một số từ 1 đến n. người chơi 2 phải đoán xem tôi đã chọn số nào. Mỗi khi người chơi 2 đoán sai, người chơi 1 sẽ cho người chơi 2 biết con số cao hơn hay thấp hơn.
Chúng ta có thể sử dụng hàm đoán (num) sẽ trả về 3 kết quả có thể có như sau -
-
-1 - Số của người chơi 1 thấp hơn
-
1 - Số người chơi 1 cao hơn
-
0 - Số được khớp
Vì vậy, nếu đầu vào là n =10, pick =5, thì đầu ra sẽ là 5.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
l:=1, r:=n
-
trong khi l - =r, do -
-
m:=l + (r - l) / 2
-
nếu đoán (m) giống 0, thì -
-
trả lại m
-
-
nếu đoán (m) giống -1, thì -
-
r:=m - 1
-
-
Nếu không
-
l:=m + 1
-
-
-
trả về 0
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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)); }
Đầu vào
5,10
Đầu ra
5