#P10384. 「HOI R1」杂交选种
「HOI R1」杂交选种
题目背景
星球盛产“代马”,其优越的速度与耗能使得它风靡整个银河系。可小 并不满足于此,他想培育出更好的“代马”,并取代掉还在用传统能源的落后四足兽。于是,他开始研究基因技术……
本题仅支持 C++ 语言提交。
由于技术限制,请勿使用 C++14 (GCC 9) 语言提交,否则将会得到 Compile Error 的结果。
你的代码中需如下进行 query
和 cross
函数的声明:
char query(int k);
void cross(int i, int j);
调用 次 query
与 cross
函数的时间不超过 50 毫秒,除这两个函数所占用的时间外,交互库运行所占用的时间不超过 100 毫秒。
题目描述
【形式化题意】
这是一道交互题。
定义 基因 为一个字符,其内容为 或 。定义 基因型 为由两个基因组成,且大写字母在小写字母之前的字符串。也即 中的一种。一个基因型的 表现 如下:
- 若基因型中含有 ,则表现为 。
- 否则,表现为 。
两个基因型可以相互 杂交,其定义如下:
- 在两个基因型中各均匀随机取一个基因,并将两个基因组合成基因型作为结果输出。
小 有 个基因型,编号为 。每次询问可以给交互库两个不同的编号 。若当前是第 次杂交,交互库会新建一个编号为 的基因型,其基因型为 杂交后的结果。
你可以在时限范围内任意次查询编号为 的种子的表现。你需要在 次杂交内,求出初始给定的 个基因型。
实现细节
你不需要,也不应该实现主函数。 你需要实现下面的函数:
vector<string> guess(int n)
- 表示初始基因型个数。
- 该函数应当返回一个长度恰好为 的数组,数组中的每一个元素是一个长度为二的字符串,表示你所求出的基因型。你需要保证大写字母在小写字母的前面。
- 对于每个测试点,该函数被恰好调用一次。
该函数可调用以下函数:
char query(int k)
- 表示你要查询的基因型的编号。你需要保证这个编号对应的基因型存在。
- 该函数将返回该基因型的表现。
- 该函数可以在时限内被调用任意次。
void cross(int i, int j)
- 代表你要杂交的两个基因的编号。你需要保证 且对应的基因型存在。
- 若是第 次调用该函数,该函数会新建一个编号为 的基因型,其基因型为 杂交后的结果。保证杂交过程为均匀随机。
- 你最多可以调用该函数 次。
- 评测程序不是适应性的。也就是说,所有初始元素的基因型在
guess
函数被调用前已经确定。
提示
【交互示例】
以下为 ,基因型为 时一种可能的交互过程。
选手程序 | 交互库 |
---|---|
guess(2) |
|
cross(1,2) |
|
cross(1,3) |
|
query(4) |
|
Ok,accepted. |
【约束条件】
- , 为偶数。
- 每次程序运行时将恰好调用一次
guess()
函数。 - 保证交互库是非自适应性的,即所有初始元素的基因型不在交互过程中发生改变。
【子任务】
Subtask | 分值 | 特殊性质 | |
---|---|---|---|
无 | |||
保证不存在 | |||
无 | |||
保证至少存在一个 | |||
无 | |||
对于所有数据,,保证 为偶数。
由于本题涉及概率与期望,如果你确定你的算法无误,可以尝试多交几发。