Interactive Problems in Competitive Programming
Interactive Problems are those problems in which our solution or code interacts with the judge in real time. When we develop a solution for an Interactive Problem then the input data given to our solution may not be predetermined but is built for that problem specifically. The solution performs a series of exchange of data with the judge and at the end of the conversation the judge decides whether our solution was correct or not.
Guessing the Number (An Interactive Problem)
In this problem the user has to guess the number during a communication with the judge. The user is provided with the upper and lower bound and he/she can ask the judge whether a number is the number to be guessed. The judge replies with -1 if the number is smaller than the number to be guessed or 1 if number is greater than the number to be guessed or 0 if it is equal to the number to be guessed.
Approach 1 : Linear Guessing
The user can query the judge for all the numbers between lower limit and upper limit to find the solution.
#include <bits/stdc++.h>
using namespace std;
int main()
{
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 6
// Iterating from lower_bound to upper_bound
for (int i = lower_bound; i <= upper_bound; i++) {
cout << i << endl;
// Input the response from the judge
int response;
cin >> response;
if (response == 0) {
cout << "Number guessed is :" << i;
break;
}
}
return 0;
}
// This code is contributed by divyeshrabadiya07
import java.util.*;
class GFG {
public static void main(String[] args)
{
Scanner sc1 = new Scanner(System.in);
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 6
// Iterating from lower_bound to upper_bound
for (int i = lower_bound; i <= upper_bound; i++) {
System.out.println(i);
// Input the response from the judge
int response = sc1.nextInt();
if (response == 0) {
System.out.println("Number guessed is :" + i);
break;
}
}
}
}
if __name__=='__main__':
lower_bound = 2;
upper_bound = 10;
# Number to be guessed is 6
# Iterating from lower_bound to upper_bound
for i in range(lower_bound, upper_bound + 1):
print(i)
# Input the response from the judge
response = int(input())
if (response == 0):
print("Number guessed is :", i, end = '')
break;
# This code is contributed by rutvik_56
using System;
class GFG
{
public static void Main(string[] args)
{
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 6
// Iterating from lower_bound to upper_bound
for (int i = lower_bound; i <= upper_bound; i++)
{
Console.WriteLine(i);
// Input the response from the judge
int response = int.Parse(Console.ReadLine());
if (response == 0) {
Console.WriteLine("Number guessed is :" + i);
break;
}
}
}
}
// This code is contributed by Pratham76
// Setting the lower and upper bounds
let lowerBound = 2;
let upperBound = 10;
// Number to be guessed is 6
// Iterating from lowerBound to upperBound
for (let i = lowerBound; i <= upperBound; i++) {
console.log(i);
// Simulating input from the judge
// (For actual input, you can use prompt() in a browser environment)
let response = prompt("Enter 0 if the number is guessed correctly:");
// Converting the response to an integer
response = parseInt(response);
if (response === 0) {
console.log("Number guessed is: " + i);
break;
}
}
// This code is contributed by divyeshrabadiya07
Output
2 Number guessed is :2
Time Complexity: O(n)
Approach 2 : Applying Binary Search
We can also apply binary search interactively to find the solution. This solution is efficient as compared to the previous approach.
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char** argv)
{
int lower_bound = 2;
int upper_bound = 10;
while (lower_bound <= upper_bound)
{
int mid = (lower_bound + upper_bound) / 2;
cout << mid << endl;
int response;
cin >> response;
if (response == -1)
lower_bound = mid + 1;
else if (response == 1)
upper_bound = mid - 1;
else if (response == 0){
cout << "Number guessed is :" + to_string(mid) << endl;
break;
}
}
return 0;
}
// This code is contributed by geeky01adarsh
import java.util.*;
class GFG {
public static void main(String[] args)
{
Scanner sc1 = new Scanner(System.in);
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 9
// Applying Binary Search interactively
while (lower_bound <= upper_bound) {
int mid = (lower_bound + upper_bound) / 2;
// Print the guessed number
System.out.println(mid);
// Input the response from the judge
int response = sc1.nextInt();
if (response == -1) {
lower_bound = mid + 1;
}
else if (response == 1) {
upper_bound = mid - 1;
}
else if (response == 0) {
System.out.println("Number guessed is :" + mid);
break;
}
}
}
}
lower_bound = 2
upper_bound = 10
# Number to be guessed is 9
# Applying Binary Search interactively
while (lower_bound <= upper_bound) :
mid = (lower_bound + upper_bound) // 2
# Print guessed number
print(mid)
# Input the response from the judge
response = int(input())
if (response == -1) :
lower_bound = mid + 1
elif (response == 1) :
upper_bound = mid - 1
elif (response == 0) :
print("Number guessed is :", mid)
break
using System;
class GFG {
static void Main() {
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 9
// Applying Binary Search interactively
while (lower_bound <= upper_bound) {
int mid = (lower_bound + upper_bound) / 2;
// Print the guessed number
Console.WriteLine(mid);
// Input the response from the judge
int response = Convert.ToInt32(Console.ReadLine());
if (response == -1) {
lower_bound = mid + 1;
}
else if (response == 1) {
upper_bound = mid - 1;
}
else if (response == 0) {
Console.WriteLine("Number guessed is :" + mid);
break;
}
}
}
}
// This code is contributed by divyesh072019
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function binarySearch() {
let lowerBound = 2;
let upperBound = 10;
// Number to be guessed is 9
// Applying Binary Search interactively
while (lowerBound <= upperBound) {
let mid = Math.floor((lowerBound + upperBound) / 2);
// Print the guessed number
console.log(mid);
// Input the response from the judge
rl.question('Enter -1 if the number is lower, 1 if higher, or 0 if guessed correctly: ', (response) => {
response = parseInt(response);
if (response === -1) {
lowerBound = mid + 1;
} else if (response === 1) {
upperBound = mid - 1;
} else if (response === 0) {
console.log("Number guessed is: " + mid);
rl.close();
return;
}
binarySearch(); // Recursively call binarySearch function
});
return; // Exit the function after asking for user input
}
}
binarySearch(); // Start the binary search
Output
6 Number guessed is :6
Time Complexity: O(logn)
Algorithm Paradigm: Divide and Conquer