UOJ Logo Universal Online Judge

UOJ

#1047. CSP-S 2022 初赛模拟

统计

题目背景

又到了一年一度的初赛寄,小 Y 开始刷往年的初赛题目练手,于是他点开了 CCF CSP-S 2021 第一轮 C++语言试题.pdf,看到了一个令人印象深刻的题目:

wk7j5cnq.png

想必各位都记得正确的答案,但是为了检验你是否是蒙的,小 Y 想让你教一教他该如何比较。

题目描述

你眼前有 $n$ 个数,编号为 $0$ 到 $n - 1$,保证所有数互不相同,但是你不知道它们的具体值,你只能派出小 $\gamma$ 去实地检验一下两个数 $x, y$ 哪个更大一些,为了防止小 $\gamma$ 过于劳累,你只能最多让小 $\gamma$ 去 $600$ 次,然后你要告诉小 Y 最小值和最大值的编号是什么。

实现细节

你需要实现一个程序,在给出数的个数 $n$,以及最多检验 $600$ 次的情况下,确定最小的数和最大的数。

你要实现以下函数:

void Solve(int n)
  • 对于每个测试用例,该函数仅调用一次,参数 $n$ 是数的个数;
  • 只允许通过调用 Compare 函数确定两个数的大小关系,只允许通过调用 Answer 函数给出最小的数和最大的数的位置。

你可以调用如下函数:

int Compare(int X, int Y)
  • 在比较两个数 $\texttt{X,Y}$ 时调用此函数,$\texttt{X,Y}$ 是大于等于 $0$ 且小于等于 $n-1$ 的整数,如果不满足以上条件,会被判为 Wrong Answer [1],程序结束;
  • 如果数 $\texttt{X}$ 的大于数 $\texttt{Y}$,则函数返回 $1$,否则返回 $-1$;
  • 如果 Compare 函数调用次数超过 $600$,会被判为 Wrong Answer [2],程序结束。

Solve 函数必须调用 Answer 函数来结束,如果 Solve 没有调用 Answer,会被判为 Wrong Answer [3]

int Answer(int X, int Y)
  • 这个函数用来回答哪个数最小与那个数最大。参数 $\texttt{X}$ 表示数 $\texttt{X}$ 的最小,参数 $\texttt{Y}$ 表示数 $\texttt{Y}$ 最大。$\texttt{X,Y}$ 都大于等于 $0$ 且小于等于 $n-1$,如果不满足条件会被判为 Wrong Answer [4]
  • 可以保证,与调用 Compare 的结果一致的答案是唯一的,如果 $\texttt{X,Y}$ 与答案不一致,则会被判为 Wrong Answer [5],一致则会被判为 Accepted
  • 调用此函数后,程序结束。

注意事项

在评分时,只要你的回答与调用 Compare 的结果不一致,都会被判为 Wrong Answer [5]

在评分时,一些测试点可能会根据之前 Compare 的调用情况修改返回值,但是 Compare 的返回值与之前 Compare 的调用结果不矛盾。

编译与运行方法

「下发文件」中提供了 chusaimoni.hchusaimoni.cppgrader.cpp 三个文件。你可以直接在 chusaimoni.cpp 的基础上进行修改,并请运行以下命令来编译:

g++ -O2 -o grader grader.cpp chusaimoni.cpp

当命令成功时,会产生一个可执行文件 grader

如果你使用的是 windows,那么将 grader 替换为 grader.exe 即可。

注意实际评测时的程序与下发的样例评测程序并不相同。

样例评测程序输入格式

样例评测程序将从标准输入读入以下数据:

  • 第一行两个整数 $n,T$,用一个空格隔开。$n$ 表示数的个数,评测程序只会处理 $T=1$ 的数据;
  • 接下来 $n$ 行,第 $i+1$ 行表示第 $i$ 个数为 $a_i$。

样例评测程序输出格式

样例评测程序将向标准输出输出以下信息。

  • 判为正确时,输出 Accepted
  • 运行过程中被判为错误时,以 Wrong Answer [x] 的格式报告并退出。

程序执行过程中违反了多种限制时,只会报告其中的一种。

注意,如果样例中 $A_X=0,A_Y=n-1$,调用了 Answer(X, Y),即使应当是 Wrong Answer [5] 的情况,测评程序也会判定 Accepted。请注意,下发的 grader 与实际测评时使用的不同。

样例测评程序输入

3 1
1
2
0

样例交互

调用函数 返回值
Compare(0, 1) -1
Compare(0, 2) 1
Answer(2, 1) 测评程序结束

数据范围

对于全部数据,$1\le n\le 400$。

详细子任务分数与附加限制见下表。

Subtask 附加限制 分数
$1$ $n\le 30$ $20$
$2$ $n\le 300$ $30$
$3$ 无附加限制 $50$