#L3368. 数蘑菇
数蘑菇
题目描述
研究蘑菇的专家安德鲁在研究新加坡的本地蘑菇。作为研究的一部分,安德鲁采集了 个蘑菇,编号为 到 。每个蘑菇均为两种蘑菇种类之一,称为 A 或 B。
安德鲁知道蘑菇 属于种类 A,但是由于这两种蘑菇看起来很相似,他不知道蘑菇 到 属于哪一种。
幸运的是,安德鲁的实验室里有一台机器可以帮助他。在使用这台机器时,需要将两个或者多个蘑菇放到机器里,并摆成一排(以任意顺序),然后打开机器。接下来,这台机器会计算所有不属于同一种类的相邻蘑菇对的个数。
例如,如果你把种类为 的蘑菇(按照这个顺序)放到机器中,结果应该是 。
但是,因为机器操作非常昂贵,机器只能使用有限的次数。此外,在机器的所有使用中,放置到机器中的蘑菇总数不能超过 。请使用这台机器帮助安德鲁来数一数他采集了多少个种类为 A 的蘑菇。
实现细节
在程序开始,你需要引入 mushrooms.h 库。
你需要实现以下函数:
int count_mushrooms(int n)
- :安德鲁采集到的蘑菇数量。
- 该函数应该被调用恰好一次,而且要返回种类为 A 的蘑菇的个数。
以上函数可以调用以下函数:
int use_machine(int[] x)
- :一个长度介于 和 的数组(包括 和 ),按顺序给出放在机器中的蘑菇的编号。
- 的元素必须是在 到 之间(包括 和 )互不相同的整数。
- 假设数组 的长度为 。那么,此函数返回不同的下标 的个数,满足 并且 和 属于不同种类。
- 该函数最多可以被调用 次。
- 在对函数
use_machine的所有调用中,所有被传到该函数的 的总长度不能超过 。
评测程序示例
评测程序示例读入一个整数数组 ,该数组给出了蘑菇的种类。对于所有 , 表示蘑菇 的种类是 A, 表示蘑菇 的种类是 B。评测程序示例读取如下格式的输入数据:
- 第 1 行:
- 第 2 行:
评测程序示例的输出为如下格式:
- 第 1 行:
count_mushrooms的返回值。 - 第 2 行:调用
use_machine的次数。
注意评测程序示例不是自适应的。
样例
样例输入 1
3
0 1 1
样例说明 1
考虑以下场景:有 个蘑菇,种类依次为 。函数 count_mushrooms 用以下方式调用:
count_mushrooms(3)
该函数可以调用 use_machine([0, 1, 2]),在该场景下调用返回 。函数接着调用 use_machine([2, 1]),该调用返回 。
此时,已经有足够的信息来推出只有 个 A 类蘑菇。所以,函数 count_mushrooms 应该返回 。
样例输入 2
4
0 1 0 0
样例说明 2
考虑一个例子:有 个蘑菇,种类依次为 。函数 count_mushrooms 被调用如下:
count_mushrooms(4)
该函数可以调用 use_machine([0, 2, 1, 3]),该调用返回 。接着调用 use_machine([1, 2]),该调用返回 。
此时,已有足够的信息推出:有 个 A 类蘑菇。因此,函数 count_mushrooms 应该返回 。
数据范围与提示
对于全部数据,保证 。
计分
在所有测试用例中,如果对函数 use_machine 的调用不符合上面所述的要求,或者 count_mushrooms 的返回值不正确,你的解答得分将为 。
否则,令 为所有测试样例中对函数 use_machine 的最大调用次数。那么,得分将按照以下表格进行计算:
| 条件 | 得分 |
|---|---|
| 0 | |
| 10 | |
| 25 | |
| 100 |