JOI 君和 IOI 酱喜欢吃拉面。JOI 君喜欢清淡的拉面,而 IOI 酱喜欢浓郁的拉面。在他们居住的城镇中,有 $N$ 家拉面店,编号从 $0$ 到 $N-1$。
我们不知道哪家店提供浓郁的拉面,也不知道哪家店提供清淡的拉面。因此,JOI 君和 IOI 酱决定巡访附近的拉面店,找出提供最清淡拉面的店和提供最浓郁拉面的店。
在他们居住的城镇中,每家拉面店提供的拉面都有一个确定的“浓郁度”。浓郁度是 $0$ 到 $N-1$ 之间的整数,且每家店的浓郁度各不相同。JOI 君和 IOI 酱每天可以巡访两家拉面店,通过比较味道,判定这两家店中哪一家的拉面浓郁度更高。
为了健康着想,JOI 君和 IOI 酱希望将进行拉面品尝比较的天数控制在 600 天以内。
题目描述
给定城镇中拉面店的数量 $N$,请编写一个程序,通过至多 600 次的比较,确定 $N$ 家拉面店中浓郁度最低的店和浓郁度最高的店。
实现细节
你需要编写一个程序,实现以下函数:
void Ramen(int N)
该函数对每个测试用例仅调用一次。参数 $N$ 是城镇中拉面店的数量。该函数必须通过调用 Compare 来确定浓郁度最低和最高的拉面店,并通过调用 Answer 来结束程序。
在程序中,你可以调用以下函数:
int Compare(int X, int Y)
该函数用于比较拉面的浓郁度。参数 $X$ 和 $Y$ 是要进行比较的拉面店编号。$X$ 和 $Y$ 必须是 $0$ 到 $N-1$ 之间互不相同的整数。如果调用时参数不满足此条件,则判定为“不正解 [1]”,程序终止。如果拉面店 $X$ 的浓郁度高于拉面店 $Y$,该函数返回 $1$;如果拉面店 $X$ 的浓郁度低于拉面店 $Y$,则返回 $-1$。如果调用 Compare 的次数超过 600 次,则判定为“不正解 [2]”,程序终止。
Ramen 函数必须通过调用以下函数来结束:如果 Ramen 没有调用 Answer,则判定为“不正解 [3]”,程序终止。
void Answer(int X, int Y)
该函数在通过比较确定了浓郁度最低和最高的拉面店后调用。参数 $X$ 和 $Y$ 分别是浓郁度最低的拉面店编号和浓郁度最高的拉面店编号。$X$ 和 $Y$ 必须是 $0$ 到 $N-1$ 之间的整数。如果调用时参数不满足此条件,则判定为“不正解 [4]”。如果根据 Compare 的调用结果,答案是唯一的,且调用 Answer 时传入了该答案,则判定为“正解”。否则判定为“不正解 [5]”。调用此函数后,程序将终止。
说明
在评分时,如果根据 Compare 的调用结果无法唯一确定答案,则无论 Answer 的参数如何,均判定为“不正解 [5]”。在部分测试数据中,Compare 的返回值可能会根据之前的调用内容而变化。即便如此,Compare 的返回值也绝不会与之前的调用结果产生矛盾。
编译与运行方法
为了测试你的程序,评测程序样例包含在可从竞赛网站下载的压缩包中。该压缩包中也包含了你需要提交的文件样例。
评测程序样例由一个文件组成,即 grader.c 或 grader.cpp。例如,若你的程序文件名为 Ramen.c 或 Ramen.cpp,则可以通过以下命令进行测试:
- C 语言:
gcc -O2 -lm grader.c Ramen.c -o grader - C++ 语言:
g++ -O2 grader.cpp Ramen.cpp -o grader
编译成功后,将生成名为 grader 的可执行文件。请注意,实际的评测程序与样例评测程序不同。样例评测程序作为单个进程启动,从标准输入读取数据,并将结果输出到标准输出。
样例评测程序输入格式
样例评测程序从标准输入读取以下内容:
- 第一行包含整数 $N, T$,以空格分隔。$N$ 是拉面店的数量。样例评测程序处理 $T=1$ 的数据。
- 接下来的 $N$ 行中,第 $i+1$ 行 ($0 \le i \le N-1$) 包含整数 $A_i$ ($0 \le A_i \le N-1$),表示拉面店 $i$ 的浓郁度。
样例评测程序输出格式
如果程序正常结束,样例评测程序会在标准输出中输出一行信息(引号不输出):
- 如果正确,输出 “Accepted”。
- 如果错误,输出错误类型,例如 “Wrong Answer [2]”。
注意:样例评测程序在 $A_X = 0, A_Y = N-1$ 的情况下调用 Answer(X, Y) 时,即使属于“不正解 [5]”的情况也会判定为正确。请注意,这与实际评测程序的行为不同。
数据范围
所有输入数据满足以下条件:
- $1 \le N \le 400$
子任务
子任务 1 [20 分]
- 满足 $N \le 30$。
子任务 2 [30 分]
- 满足 $N \le 300$。
子任务 3 [50 分]
- 无额外限制。
样例
输入格式 1
3 1 1 2 0
输出格式 1
Compare(0, 1) -1 Compare(0, 2) 1 Answer(2, 1)
说明
以上是样例评测程序读取的输入示例,以及对应的函数调用示例。