Đoán số

Xem dạng PDF

Gửi bài giải

Điểm: 100,00 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 64M
Input: stdin
Output: stdout

Tác giả:
Người đăng:
Dạng bài
Ngôn ngữ cho phép
C++, Pascal, PyPy, Python

Đây là bài toán giao tiếp với máy chấm (Interactive problem)

Thuận có một con số n bí mật. Điều duy nhất bạn biết về con số này là 1n2×109. Thuận và bạn sẽ chơi một trò chơi như sau: Bạn sẽ được chọn một số bất kỳ và nói cho Thuận nghe số đó. Thuận sẽ cho bạn biết con số của bạn lớn hơn, nhỏ hơn, hay bằng n. Hãy đoán xem n là số nào trong không quá 31 câu hỏi.

Cách Thức Giao Tiếp

Mỗi lượt, bạn sẽ in ra một số x trên một dòng (1x2×109). Máy tính sẽ đọc x và in ra màn hình một chuỗi tương ứng với các trường hợp sau:

  • "BIGGER" nếu n>x
  • "SMALLER" nếu n<x
  • "HOLA" nếu n=x.

Lưu ý:

  • Chuỗi mà máy in ra màn hình không có dấu "
  • Nếu các bạn in ra một output không hợp lệ (không phải là một số, số ngoài đoạn [1,2×109] thì nhiều khả năng bị TLE.
  • Sau khi in mỗi số, bạn phải xuống dòng (ví dụ in endl trong C++)
  • Khi in ra một dòng, các bạn phải flush output bằng cách cout.flush hoặc dùng endl thay vì \n
Example

Con số bí mật trong test này là 5.

Input Output Giải thích
1 Bạn đoán số 1
SMALLER Số 1 nhỏ hơn đáp án
9 Bạn đoán số 9
BIGGER Số 9 lớn hơn đáp án
5 Bạn đoán số 5
HOLA Hola! Bạn đã đoán đúng mà chỉ dùng 3 câu hỏi!

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 0
    nghung201417   đã bình luận 3 ngày trước

    halo


  • 0
    pgkpp22   đã bình luận 17 ngày trước

    python nhé if name=='main': l, r=1, 210*9 while l<=r: m=(l+r)//2 print(m) inp=input() if inp=='HOLA': break elif inp=='BIGGER': l=m+1 else: r=m-1


  • 0
    QTB_42   đã bình luận một tháng trước

    include<bits/stdc++.h>

    define str string

    define ll long long

    using namespace std;

    int main(){ ll l=1, r=2e9; while (true){ ll m=(l+r)/2; cout << m << endl; str inp; cin >> inp; if(inp=="HOLA")return 0; else if(inp=="SMALLER")r=m-1; else l=m+1; } return 0; }


  • 0
    hhoang15   đã bình luận một tháng trước

    qua la bruh=))

    include <iostream>

    include <algorithm>

    include <vector>

    include <string>

    include <cmath>

    include <map>

    include <set>

    include <queue>

    include <climits>

    using namespace std; using ll = long long; int main(){ ll n; cin >> n;
    ll lo = 1, hi = n; while (lo <= hi) { ll mid = lo + (hi - lo) / 2; cout << mid << endl;
    string s; cin >> s;
    if (s == "HOLA") { break; } else if (s == "SMALLER") { lo = mid + 1; } else if (s == "BIGGER") { hi = mid - 1; } else { return 0; } } return 0; }


    • 0
      minhtruong26   đã bình luận 24 ngày trước

      sao cứ lô hi li hô hô thế


  • 0
    Phong1234   đã bình luận một tháng trước

    code đây nhé //phmong16

    Copy
     ios_base::sync_with_stdio(0);
     cin.tie(0);
    ll l = 1;
    ll h = 2e9;
    
    while (l<= h) {
        ll m = l + (h - l) / 2;
        cout << m << endl;
        string r;
        cin >> r;
        if (r == "BIGGER") {
            l = m + 1;
        } else if (r == "SMALLER") {
            h = m - 1;
        } else if (r == "HOLA") {
            break;
        }
    }
    return 0;
    

    } c++nhé


    • 0
      hhoang15   đã bình luận một tháng trước

      yo =)))


  • -1
    25A-463   đã bình luận một tháng trước

    trai = 1 phai = 2000000000

    while trai <= phai: doan = (trai + phai) // 2 print(doan, flush=True)

    Copy
    tra_loi = input()
    
    if tra_loi == "HOLA":
        break
    elif tra_loi == "BIGGER":
        trai = doan + 1
    elif tra_loi == "SMALLER":
        phai = doan - 1
    

  • 0
    nhatnam2   đã bình luận một tháng trước

    chết mai thi (16/4/2025) mà trúng bài này là chết


    • 0
      1qaz   đã bình luận một tháng trước

      đúng


    • 0
      minhtruong26   đã bình luận một tháng trước

      chờ thi dài cổ


  • 5
    KVMB23A_67   đã bình luận một tháng trước sửa 3

    code PY:

    Copy
    if __name__=='__main__':
        l, r=1, 2*10**9
        while l<=r:
            m=(l+r)//2
            print(m)
            inp=input()
            if inp=='HOLA': break
            elif inp=='BIGGER': l=m+1
            else: r=m-1
    

    code C++:

    Copy
    #include<bits/stdc++.h>
    #define str string
    #define ll long long
    using namespace std;
    
    int main(){
        ll l=1, r=2e9;
        while (true){
            ll m=(l+r)/2;
            cout << m << endl;
            str inp; cin >> inp;
            if(inp=="HOLA")return 0;
            else if(inp=="SMALLER")r=m-1;
            else l=m+1;
        }
        return 0;
    }
    

    • -1
      1qaz   đã bình luận một tháng trước

      code PY được


  • -1
    khailuongphong   đã bình luận một tháng trước sửa 3

    Hò khét . khó quáááááááá


  • -1
    quan5a5   đã bình luận một tháng trước

    mai thi


  • 0
    phambahuy5ddl   đã bình luận một tháng trước

    scratch làm sao làm đc


  • 0
    phambahuy5ddl   đã bình luận một tháng trước

    alo


  • 0
    vietdz123   đã bình luận một tháng trước

    bài này sao giải bắng scratch v


  • -1
    DRMacc2Bandang   đã bình luận một tháng trước chỉnh sửa

    tỉ lệ đoán đúng là 10 ^ 9 chia 2 "30 lần" Ai nói cho tôi code này sao ac 1 test v? bg = 2000000000 sm = 1 step = "BIGGER" while True: if step = "BIGGER": bg = int(bg / 2 // 1) if step = "SMALLER": bg = int(bg * 1.5 // 1) print(bg) m = str(input()) if m == "HOLA": break elif m == "SMALLER": step = "SMALLER" else: step = "BIGGER"


  • -1
    hanghai8891   đã bình luận một tháng trước

    Tỷ lệ đoán đúng là 1/2000000000 mà được đoán có 30 lần thì làm sao mà đoán được


  • -1
    nguyentrungnguyen5ddl   đã bình luận một tháng trước

    tui ko b


  • -5
    quan5a5   đã bình luận một tháng trước

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.


  • -2
    minhtruong26   đã bình luận một tháng trước

    ai biết lệnh nào trong python giống khối repeat until trong scratch không


    • -2
      thyhnc   đã bình luận một tháng trước chỉnh sửa

      while á bạn

      cú pháp:

      while condition: statements [break]


      • 0
        minhtruong26   đã bình luận một tháng trước

        cảm ơn bạn👍🏻🙏🏻


  • -2
    khanhs_2k14   đã bình luận 2 tháng trước

    bài này dễ nhưng... tỷ lệ là 1/2000000000 mà chỉ cho 30 câu thì đoán kiểu j


  • -2
    25A-357   đã bình luận 2 tháng trước

    dễ mà: giải: l = 1 h = 2 * 10**9

    while l <= h: m = (l + h) // 2 print(m, flush=True)

    Copy
    f = input().strip()
    
    if f == "BIGGER":
        l = m + 1
    elif f == "SMALLER":
        h = m - 1
    elif f == "HOLA":
        break
    

    python 3


    • 0
      minhtruong26   đã bình luận một tháng trước chỉnh sửa

      sai rồi bạn, kiểm tra trước đi rồi mới đăng😅


      • -1
        KVMB23A_67   đã bình luận một tháng trước

        sai chỗ nào v


        • 0
          minhtruong26   đã bình luận một tháng trước chỉnh sửa

          đăng ảnh kiểu gì chỉ mình, mình tải lỗi cho🤔


          • 0
            KVMB23A_67   đã bình luận một tháng trước

            dùng lời nói đi bro


            • 0
              minhtruong26   đã bình luận một tháng trước

              Biên dịch gặp lỗi guessgamecpp.cpp:1:1: error: ‘f’ does not name a type 1 | f = input().strip() | ^


            • 0
              minhtruong26   đã bình luận một tháng trước

              bạn vote mình -1 à


            • 0
              minhtruong26   đã bình luận một tháng trước

              Test case #1: Lỗi khi chạy chương trình (IR) (NameError) [0,061s, 5.82 MB] (0/1) Test case #2: Lỗi khi chạy chương trình (IR) (NameError) [0,079s, 5.78 MB] (0/1) Test case #3: Lỗi khi chạy chương trình (IR) (NameError) [0,020s, 5.95 MB] (0/1) Test case #4: Lỗi khi chạy chương trình (IR) (NameError) [0,054s, 5.92 MB] (0/1) Test case #5: Lỗi khi chạy chương trình (IR) (NameError) [0,038s, 5.84 MB] (0/1)


  • 0
    lovevsick   đã bình luận 2 tháng trước

    bài này tịt luôn, chju thật..


  • 0
    doandulamtin   đã bình luận 2 tháng trước

    bài này dùng hàm random :)) (100% ko hiểu quả)


    • -1
      nguyenminhtri_2014   đã bình luận 2 tháng trước sửa 2

      a=randit.random(1,10)

      print(a)

      thử đi


      • -1
        25B-372   đã bình luận 2 tháng trước

        tôi bị Invalid Return nha =((


  • -1
    khang_5c   đã bình luận 2 tháng trước

    LỜI GIẢI FRSKRT


  • 1
    NAN24B_32   đã bình luận 3 tháng trước

    ai giải thích hộ tôi với, tôi ko hiểu nổi cái đề


    • -1
      nguyenminhtri_2014   đã bình luận 2 tháng trước

      Là máy chọn một số ngẫu nhiên từ 1 đến 2000000000=(a). Cho nhập vào từng số, nếu số đó lớn hơn (a) thì nói 'BIGGER', nếu nhỏ hơn a thì nói 'SMALLER', nếu bằng a thì noi 'HOLA'


  • 2
    tinhoctredtsd   đã bình luận 3 tháng trước

    def Bi(a,b): x=int((a+b)//2) print(x) i=input() if i=="BIGGER": Bi(x,b) elif i=="SMALLER": Bi(a,x) Bi(1,2000000000)


  • -1
    sb20240044   đã bình luận 4 tháng trước

    Tôi bị TLE TToTT


  • -1
    sb20240044   đã bình luận 4 tháng trước

    bài này dễ... nhưng tại sao các bạn cứ dùng C++?!!!!!


    • 1
      KVMB23A_67   đã bình luận 3 tháng trước

      chủ yếu là do thuật thôi, bài này dùng c++ mà thuật yếu thì cũng vậy mà


      • 1
        sb20240044   đã bình luận 3 tháng trước

        Xin lỗi nhưng mình không giỏi C++ mà giỏi python 😵


        • 0
          minhtruong26   đã bình luận 24 ngày trước

          mình chỉ làm scratch thôi


          • 0
            ngotramanh5a   đã bình luận 14 ngày trước

            bài này làm trên Scratch kiểu j vậy chỉ mình với


  • -1
    KVMB23A_67   đã bình luận 5 tháng trước

    bài này dùng binary search


  • 3
    NguyenHPhong   đã bình luận 5 tháng trước chỉnh sửa

    hello


  • -27
    truongphat   đã bình luận 6 tháng trước

    Bình luận này đã bị ẩn vì có quá nhiều phản ứng tiêu cực. Nhấn để xem.