猫空缆车是台北市的一个著名景点。这个缆车系统包括一个环形轨道、一个缆车站和
缆车可能会发生故障。幸运的是,我们有无限多个后备的空闲缆车,其编号依次为
你喜欢去缆车站上观察缆车过站。一个缆车序列是由缆车过站次序形成的
注意,在轨道上的相同一组缆车,有可能给出多种缆车序列,这取决于当你到缆车站时哪辆缆车最先过站。举个例子,如果没有任何缆车发生故障,那么
如果缆车
故障缆车 | 新缆车 | 可能的缆车序列 |
---|---|---|
一个替换序列是一个由故障缆车编号组成的序列,其次序与故障发生次序相同。在前面的例子中,替换序列是
缆车序列检查
在前三个子任务中,你必须检查某个输入序列是否是一个缆车序列。下表举例说明了哪些序列是缆车序列而哪些不是。你需要实现一个函数 valid。
- valid(n, inputSeq)
: 输入序列长度- inputSeq: 大小为
的数组;inputSeq[i] 是输入序列的第 个元素,其中 。 - 当输入序列是一个缆车序列时,函数应返回
,否则返回 。
子任务1, 2, 3
子任务 | 分值 | inputSeq | |
---|---|---|---|
1 | 5 | 从 | |
2 | 5 | ||
3 | 10 |
例子
子任务 | inputSeq | 返回值 | 备注 |
---|---|---|---|
1 | |||
1 | |||
1 | |||
1 | |||
2 | 有两个缆车编号都是 | ||
3 | 替换序列是 | ||
3 |
替换序列
在接下来的三个子任务中,你必须构造一个能够生成给定缆车序列的可能的替换序列。满足条件的任意替换序列都可以。你需要实现一个函数 replacement。
- replacement(n, gondolaSeq, replacementSeq)
是缆车序列的长度。- gondolaSeq: 大小为
的数组;gondolaSeq 保证是一个缆车序列,而 gondolaSeq[i] 是序列中的第 个元素,这里 。 - 函数应返回替换序列的长度
。 - replacementSeq: 一个足够大的能存下替换序列的数组;你应当将替换序列中的第
个元素存放到 replacementSeq[i] 做为返回结果,这里 。
子任务4, 5, 6
子任务 | 分值 | gondolaSeq | |
---|---|---|---|
4 | 5 | ||
5 | 10 | ||
6 | 20 |
例子
子任务 | gondolaSeq | 返回值 | replacementSeq |
---|---|---|---|
4 | |||
4 | |||
5 |
替换序列计数
在接下来的四个子任务中,你必须计算所有能够生成给定序列(有可能是缆车序列,也有可能不是)的可能替换序列的数目,并将其对
- countReplacement(n, inputSeq)
: 输入序列的长度。- inputSeq: 大小为
的数组;inputSeq[i] 是输入序列的第 个元素,其中 。 - 如果输入序列是一个缆车序列,则计算能够生成该缆车序列的可能的替换序列的数目(有可能会非常大),然后将该数值对
取模做为返回值。如果输入序列不是一个缆车序列,函数应返回 。如果输入序列是一个缆车序列,但是没有缆车发生故障,函数应返回 。
子任务7, 8, 9, 10
子任务 | 分值 | inputSeq | |
---|---|---|---|
7 | 5 | ||
8 | 15 | ||
9 | 15 | ||
10 | 10 |
例子
子任务 | inputSeq | 返回值 | 替换序列 |
---|---|---|---|
7 | |||
8 | |||
9 | inputSeq不是一个缆车序列 | ||
10 |
实现细节
本题只支持 C/C++。
你只能提交一个源文件实现上述的函数,在该文件中应实现前面所述的三个函数(即便你只想解决其中的部分子任务,也要给出全部函数),并遵循下述命名与接口。你还需要包含头文件 gondola.h。
int valid(int n, int inputSeq[]);
int replacement(int n, int gondolaSeq[], int replacementSeq[]);
int countReplacement(int n, int inputSeq[]);
评测方式
评测系统将会读入如下格式的输入数据:
- 第
行: ,你的程序需要解决的子任务编号( )。 - 第
行: ,输入序列的长度。 - 第
行: 如果 是4、5或者6,此行包含 。否则此行包含 。
时间限制:
空间限制: