QOJ.ac

QOJ

Time Limit: 1 s Memory Limit: 256 MB Total points: 100 Interactive

#1399. 拉面

Statistics

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.cgrader.cpp。例如,若你的程序文件名为 Ramen.cRamen.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)

说明

以上是样例评测程序读取的输入示例,以及对应的函数调用示例。

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.