📜  竞争性编程中的互动问题套装2

📅  最后修改于: 2021-06-26 02:06:06             🧑  作者: Mango

上一篇文章中已经讨论了竞争性编程中交互问题的介绍。在本文中,讨论了基于相同概念的另一个问题。

假设法官有一个隐藏的(意味着用户无法访问它)已排序的数组。

用户(即您)需要确定给定元素VAL是否位于由开始索引和结束索引分别为STARTEND给出的排序数组空间中。
为了让用户知道在给定的数组空间中是否存在VAL ,用户需要与法官互动,以便用户可以在法官的帮助下了解特定索引处的值。

让我们举个例子:
用户需要在START = 0END = 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 = 0end = 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等)中,打印到输出屏幕是一个耗时/昂贵的过程,因此,程序的整个输出存储在缓冲区中然后在程序终止后,将缓冲区中的所有值一起打印到输出屏幕上。但这会引起交互问题,因为在线法官只会从输出屏幕(而不是缓冲区)获取输入,因此需要将缓冲区的内容传输到实际输出屏幕。这种传输实际上称为推入,因为我们正在迫使缓冲区将其内容加载到输出屏幕上。

用于推送的命令如下:

  1. C++: fflush(标准输出)
  2. Java: System.out.flush()
  3. Python:
    导入系统
    sys.stdout.flush()

可以练习下列问题,以发展一些互动式问题技能并熟悉其工作原理。
问题1
问题2

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。