となる を一つ求める問題です。
であることから、 ではなく、どこかで となります。
1と の間の について、 であれば、1から の間に値が変わることが無いかもしれませんが、からの間では少なくとも1つ値が変わるところがあります。そこで、からの間を調べればよいです。 であれば、1からの間を調べればよいです。1と の中間をとする二分法を繰り返して範囲を絞り込むことで答えが求められます。
コード例 (Julia)
function solve() # 入力 readInts() = parse.(Int,split(readline())) readInt() = parse(Int,readline()) N = readInt() zero = 1 one = N while one - zero > 1 a = div( one + zero, 2) println("? ",a) b = readInt() if b == 0 zero = a else one = a end end println("! ",zero) end # function solve # main solve()