上一篇文章中已经讨论了竞争性编程中交互问题的介绍。在本文中,讨论了基于相同概念的另一个问题。
假设法官有一个隐藏的(意味着用户无法访问它)已排序的数组。
用户(即您)需要确定给定元素VAL是否位于由开始索引和结束索引分别为START和END给出的排序数组空间中。
为了让用户知道在给定的数组空间中是否存在VAL ,用户需要与法官互动,以便用户可以在法官的帮助下了解特定索引处的值。
让我们举个例子:
用户需要在START = 0和END = 5之间找到VAL = 2 。
法官存储排序后的数组arr [] = {1、2、3、4、5、6} (基于0的索引)。
现在,允许用户将输入作为索引提供给法官,法官必须用该索引处的值来响应用户。
基本上,对于用户的某些输入索引,法官将使用该输入索引处的值进行响应,并且此过程一直进行到用户最终确定值VAL是否在数组中为止。
用户尝试对数组进行排序时尝试进行二进制搜索。这是用户将二进制搜索实现为以下程序时所使用的程序的一部分:
TASK
{
if VAL is equal to Value_Given_By_Judge
Prints "Value exist" and return
else if VAL is less than A[mid]
end = mid-1
else if VAL is greater than A[mid]
start = mid+1
}
用户使用的两个变量是start = 0和end = 5
发生以下交互:
User calculates mid = (start + end) / 2 = 2;
Judge outputs 3 // Value at index 2
User updates mid = (start + end) / 2 = 4
Judge OUTPUT : 5 // Value at index 4
User again performs TASK and prints "Value exists"
and returns as it finds VAL
因此,为了与在线法官互动,要求在线法官从用户那里获取输入,然后给出一些相应的输出,可以将其作为输入。它类似于在输出屏幕上打印输入/输出,但是在某些语言(如C++, Python, Java等)中,打印到输出屏幕是一个耗时/昂贵的过程,因此,程序的整个输出存储在缓冲区中然后在程序终止后,将缓冲区中的所有值一起打印到输出屏幕上。但这会引起交互问题,因为在线法官只会从输出屏幕(而不是缓冲区)获取输入,因此需要将缓冲区的内容传输到实际输出屏幕。这种传输实际上称为推入,因为我们正在迫使缓冲区将其内容加载到输出屏幕上。
用于推送的命令如下:
- C++: fflush(标准输出)
- Java: System.out.flush()
- Python:
导入系统
sys.stdout.flush()
可以练习下列问题,以发展一些互动式问题技能并熟悉其工作原理。
问题1
问题2
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。