“大奖”是一个家喻户晓的TV游戏节目。这次你很幸运地进入到最后一轮。已知编号从
类型
你的目标是赢得那块钻石。在游戏结束时,你必须打开一个盒子并收取盒子内的奖品。在选择要打开的盒子之前,你可以向节目主持人Rambod提一些问题。在每一个问题中,你选择就某个
- 在
号盒子左面的盒子中,刚好有 个盒子中的奖品,价值比 号盒子中的奖品价值要高。 - 在
号盒子右面的盒子中,刚好有 个盒子中的奖品,价值比 号盒子中的奖品价值要高。
例如,假设
号盒子和 号盒子中恰好有一个盒子中的奖品比 号盒子中的奖品更贵。- 在
号盒子中恰好有 个盒子中的奖品比 号盒子中的奖品更贵。
你的任务就是通过问少量的问题找出包含钻石的盒子。
实现细节
本题只支持C++。
你应当实现如下函数段:
int find_best(int n)
- 此函数只被评测程序调用仅一次。
: 盒子的数量.- 你实现的这个函数应该返回装有钻石的盒子编号,即,唯一的整数
( )使得 号盒子放有类型为 的奖品。
上述函数可以调用下列函数:
std::vector<int> ask(int i)
: 你在询问时选择的盒子编号。 的数值必须介于 和 之间(含)。- 这个函数返回包含
个元素的数组 。其中, 是在 号盒子的左面,奖品比 号盒子的奖品价值更高的盒子数目。而 则是在 号盒子右面,奖品比 号盒子的奖品价值更高的盒子数目。
例子
评测工具将做如下函数调用: find_best(8)
。
这里有 ask
的所有可能的调用以及相应的返回值列出如下:
ask(0)
返回ask(1)
返回ask(2)
返回ask(3)
返回ask(4)
返回ask(5)
返回ask(6)
返回ask(7)
返回
在这个例子中, 钻石放在 find_best
应该返回
上图阐释了这个例子。图中上半部分给出了每个盒子中奖品的类型。图中的下半部分阐释了询问 ask(2)
。做了标记(打
数据范围
- 每个盒子中奖品的类型介于
和 之间(含)。 - 类型
的奖品恰有一个。 - 对于所有
,如果类型 的奖品有 个,那么类型 的奖品将严格多于 个。
在某些测试数据中,评测工具的行为是自适应的。这意味着在这些测试数据中评测工具并没有一个固定的奖品序列。取而代之的是,由评测工具给出的答案可能依赖于你的程序问过的问题。评测工具的回答方式可以保证,在每次回答之后,至少有一个奖品序列与到目前为止给出的所有回答都不冲突。
子任务编号 | 限制与约定 | 分值 |
---|---|---|
恰好有 ask 最多 |
||
无附加限制 |
在子任务 ask
被调用的最大次数,那么你在这个子任务上的得分将按照下表计算:
问题 | 得分 |
---|---|
Wrong Answer ) |
|
时间限制:
空间限制:
评分程序样例
评分程序样例不是自适应的。取而代之的是,它只是读取并使用一个固定的奖品类型的数组
- 第
行: - 第
行:
评分程序样例输出单独一行,其中包含 find_best
的返回值以及调用函数 ask
的次数。