Fişierul intrare/ieşire:cbinteractiv.in, cbinteractiv.outSursăad-hoc
AutorArhiva EducationalaAdăugată deAlexandruLuchianov1Alex Luchianov AlexandruLuchianov1
Timp execuţie pe test0.2 secLimită de memorie131072 kbytes
Scorul tăuN/ADificultateN/A

Vezi solutiile trimise | Statistici

Cbinteractiv

Se dă un număr N şi interactorul are un număr ascuns, K de la 1 la N pe care voi trebuie să îl găsiţi.
Puteţi întreba de un număr X iar interactorul vă va spune dacă acesta este mai mare sau egal decât K.

Interacţiune

Iniţial se citeşte din stdin numărul N.
Programul vostru are voie să pună query-uri scriind în standard output:

  • " ?\;X " reprezentând întrebarea.

După fiecare astfel de query interactorul vă va răspunde în stdin cu un număr din mulţimea  \{-1, 0, 1\} :

  • "0" dacă K > X
  • "1" dacă KX
  • "-1" dacă query-ul este invalid, trebuie să închideţi programul după ce primiţi acest verdict. Un query este considerat valid dacă 1 ≤ X ≤ N

După ce aţi aflat numărul K afişaţi " !\;K " şi terminaţi programul.
După fiecare query, inclusiv cel final trebuie să afişaţi '\n' şi să daţi flush la standard output. Pentru a da flush vă puteţi folosi de următorul tabel.

LimbajC/C++PascalPythonJavaRust
Header necesar


import sys

use std::io::{self,Write};
Funcţie
fflush(stdout) sau cout.flush()
flush(output)
sys.stdout.flush()
System.out.flush()
io::stdout().flush().unwrap();

Restricţii

  • 1 ≤ N ≤ 10^9
  • Pentru 30% din teste N ≤ 500

Punctare

Dacă numărul găsit de voi este diferit de K, punctajul pe acel test va fi 0.
Altfel, punctajul vostru va fi decis în funcţie de Q numărul de query-uri făcute de programul vostru:

  • Q ≤ 32, 100% din punctajul pe acel test.
  • Q ≤ 500, 30% din punctajul pe acel test.
  • Q > 500, 0% din punctajul pe acel test.

Exemplu

stdinstdoutExplicaţie
​10
​ ​
Se citeşte N
​​
​? 5
Query cu X = 5
​1
​ ​
Se răspunde că K <= X
​​
? ​4
Query cu X = 4
​0
​ ​
Se răspunde că K > X
​​
! 5
Programul a descoperit valoarea lui K şi răspunde.

Explicaţie

Problemele interactive devin din ce în ce mai comune, inclusiv pe infoarena. La astfel de probleme inputul şi outputul sunt speciale, în acest sens există un interactor cu care puteţi comunica, adică outputul sau este inputul vostru şi vice-versa. Această este o reprezentare interactivă a problemei căutării binare . Problemele interactive pot fi abordate în toate limbajele suportate de infoarena: C, C++, Python, Rust, Java, Pascal.

Atunci când rezolvăm probleme interactive trebuie să fim atenţi la faptul că înainte ca outputul să ajungă la interactor acesta este ţinut într-un buffer intern. O cauza comună a greşelilor la problemele interactive este faptul că outputul nu iese din buffer, de aceea noi forţăm transferul de informaţii de la buffer la interactor prin instrucţiunea de flush.

Această problema este dată ca exemplu în ghidul de adăugat probleme interactive.

Aplicaţii

Trebuie sa te autentifici pentru a trimite solutii. Click aici

Cum se trimit solutii?