Pak Blangkon 的房子四周有
假设将昆虫按照类型分组。 我们定义最常见昆虫类型的基数是昆虫最多的分组中的昆虫数。 类似地,最罕见昆虫类型的基数是昆虫最少的分组中的昆虫数。
例如,假设有
Pak Blangkon 不知道这些昆虫的类型。 他有一台单按钮的机器,可以提供昆虫类型相关的信息。 刚开始时,机器是空的。 在使用机器时,可以做如下三种操作:
- 将一只昆虫放进机器。
- 将一只昆虫取出机器。
- 按下机器的按钮。
每种操作最多可以做
每当按下按钮时,机器会报告在机器内的最常见昆虫类型的基数。
你的任务是使用上述机器,确定 Pak Blangkon 的房子四周所有
实现细节
你要实现以下函数:
int min_cardinality(int N)
:昆虫数量。- 此函数应返回 Pak Blangkon 的房子四周所有
只昆虫中最罕见昆虫类型的基数。 - 此函数恰好被调用一次。
该函数可调用以下几个函数:
void move_inside(int i)
:将被放进机器的昆虫编号。编号 的取值范围是 至 (包含 和 )。- 如果昆虫已在机器内,函数调用不会影响机器内昆虫的集合。但是,调用仍会被计入此类操作的次数。
- 此函数最多可以被调用
次。
void move_outside(int i)
:将被从机器中取出的昆虫编号。编号 的取值范围是 至 (包含 和 )。- 如果昆虫已在机器外,函数调用不会影响机器内昆虫的集合。但是,调用仍会被计入此类操作的次数。
- 此函数最多可以被调用
次。
int press_button()
- 此函数返回机器内最常见昆虫类型的基数。
- 此函数最多可以被调用
次。 - 评测程序不是适应性的。也就是说,所有
只昆虫的类型在min_cardinality
调用前已经确定。
例子
考虑在某个场景下,有 min_cardinality
的调用方式如下:
min_cardinality(6)
此函数按以下次序调用了 move_inside
、move_outside
和 press_button
。
函数调用 | 返回值 | 机器内的昆虫 | 机器内的昆虫类型 |
---|---|---|---|
move_inside(0) |
|||
press_button() |
|||
move_inside(1) |
|||
press_button() |
|||
move_inside(3) |
|||
press_button() |
|||
move_inside(2) |
|||
move_inside(4) |
|||
move_inside(5) |
|||
press_button() |
|||
move_inside(5) |
|||
press_button() |
|||
move_outside(5) |
|||
press_button() |
至此,已有充分信息表明,最罕见昆虫类型的基数是 min_cardinality
应返回
在这个例子里,move_inside
被调用 move_outside
被调用 press_button
被调用
约束条件
子任务
- (10 分)
- (15 分)
- (75 分) 没有额外的约束条件。
如果在某个测试用例上,函数 move_inside
、move_outside
或 press_button
的调用次数不符合“实现细节”中给出的约束条件,或者 min_cardinality
的返回值不正确,你的解答在此子任务上得分为
令 move_inside
的调用次数、move_outside
的调用次数、press_button
的调用次数。
在子任务 3 中,你可能会得部分分。
令
条件 | 得分 |
---|---|
评测程序示例
令
评测程序示例按以下格式读取输入:
- 第
行: - 第
行:
如果评测程序示例检测到非法行为,评测程序示例将输出 Protocol Violation: <MSG>
,其中 <MSG>
为如下某种类型:
invalid parameter
:在函数调用move_inside
或move_outside
时,参数 的值不在 至 的范围内(包括 和 )。too many calls
:函数move_inside
、move_outside
或press_button
中某个的调用次数超过 次。
否则,评测程序示例按以下格式输出:
- 第
行:min_cardinality
的返回值 - 第
行:
hack
hack 数据第一行需要有两个整数,第二个固定为
时间限制:
空间限制: