Đoán số

Xem PDF

Điểm: 200 (p) Thời gian: 1.0s Bộ nhớ: 256M Input: bàn phím Output: màn hình

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

cuom1999 có một con số \(n\) bí mật. Điều duy nhất bạn biết về con số này là \(1 \leq n \leq 2 \times 10^9\). cuom1999 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 cuom1999 nghe số đó. cuom1999 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 (\(1\leq x \leq 2 \times 10^9\)). 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 \times 10^9]\) 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

Test 1

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


  • 1
    jumptozero    3:57 p.m. 25 Tháng 6, 2020 chỉnh sửa 2
    • Mình xin chia sẻ lời giải bài toán này như sau:
    • Ý tưởng bài này quen thuộc: Chặt nhị phân thông thường. (\(2^{31}=2.(2^{10})^3=2.1024^3\sim 2e9\) vừa đẹp).
    • Điểm đặc biệt của các bài toán interactive là ta "vừa xuất vừa nhập". Tức là ta in ra một đáp án bất kì, và sau đó hệ thống sẽ trả lại ta một kết quả, và nhiệm vụ của ta là nhập kết quả này để đưa ra những hoạt động tiếp theo ... (đoạn này có vẻ khó hiểu, nên bạn có thể bỏ qua, xem trực tiếp phần code luôn cũng được).
    • Dưới đây là lời giải của mình, các bạn có thể tham khảo.
    C++
    #include<bits/stdc++.h>
    
    using namespace std;
    #define ll long long 
    int main() {
        ll l = 1, r = (ll)(2e9),mid;
        while (1) {
             mid = (l + r ) / 2;
            cout<<mid<<'\n';
            string s;
            cin>>s;
            if(s=="SMALLER")
                r = mid - 1;
            else if (s=="BIGGER")
                l = mid+1;
            else break;
        }
    
        return 0;
    }
    
    • P/s: Ở trên cái đề là "HOLA" nhé, không phải "BINGO" (vì mình đã test rồi).
    • Nếu có gì khó hiểu hoặc sai , mọi người cứ comment nhé.
    1 phản hồi

    • -3
      tuandq    8:04 p.m. 23 Tháng 6, 2020

      High level


      • 2
        Lê_Gia_Khánh    6:46 p.m. 22 Tháng 6, 2020

        Đề này Chill phết


        • -2
          tuandq    4:57 p.m. 22 Tháng 6, 2020 chỉnh sửa 2

          High level


          • -5
            todonghai2k7    4:48 p.m. 22 Tháng 6, 2020

            Bình luận bị ẩn vì nhiều phản hồi tiêu cực. Nhấp vào đây để mở.


            • 3
              SPyofgame    3:48 p.m. 22 Tháng 6, 2020

              Đề sẽ in ra "BINGO" nếu \(n = x\) mà trong test ghi "HOLA" ._.