#P17142. [NOI 2026] 布丁
[NOI 2026] 布丁
题目描述
小 和小 都非常喜欢香甜而软糯的布丁。在品尝过各种布丁后,她们将所有布丁的美味度量化为不超过 的正整数。
小 正在学习制作布丁。因熟练程度有限,她只能制作出美味度不超过常数 的布丁。在某次尝试中,小 成功制作出了一块美味度为 的布丁。小 想品尝小 制作的布丁,但需要按照小 要求的方式求出她制作的布丁的美味度。
具体地,小 可以从商店购买若干块布丁并交给小 。小 会把自己制作的布丁混入其中,并将这些布丁按照美味度升序排序。然后,小 会计算全部相邻布丁美味度的最大公约数之和并告诉小 。最后,她会将所有小 买来的布丁吃掉。
形式化地,设小 购买了 块布丁,美味度分别为 。将 按升序排序后的结果记为 ,则小 会将 的值告诉小 。
由于前往商店的时间成本与购买布丁的经济成本都很高,小 希望尽可能减少购买的次数以及购买的布丁总数。你需要帮助小 制定购买策略,以求出小 制作的布丁的美味度。
【实现细节】
选手不需要,也不应实现 main 函数。
选手需要确保提交的程序包含头文件 pudding.h,即在程序开头加入以下代码:
#include "pudding.h"
选手需要在提交的程序源文件 pudding.cpp 中实现以下两个函数:
void init(int c, int t);
- 分别表示测试点编号与测试数据组数。 表示该测试点为样例。
- 对于每个测试点,该函数会在程序开始运行时被交互库调用恰好一次。
int find_tastiness(int c, int m);
- 分别表示测试点编号与小 制作的布丁的美味度上界。
- 该函数需要返回一个正整数 ,表示小 制作的布丁的美味度。
- 对于每个测试点,该函数会被交互库调用恰好 次。
选手可以通过调用以下函数进行一次询问:
int query_tastiness(std::vector<int> a);
- 表示小 购买的布丁的美味度序列。选手需要确保 非空,且其中的每个元素均为不超过 的正整数。
- 该函数会返回小 告诉小 的值,具体含义如【题目描述】中所示。
- 选手需要确保交互库每次调用
find_tastiness时,调用该函数的次数不超过 ,且调用该函数时传入的 的长度之和不超过 。
在任何情况下,交互库运行所需时间均不会超过 秒,所用内存不会超过 。
本试题目录下的 template_pudding.cpp 是提供的示例代码,选手可参考并实现自己的代码。
输入格式
【测试程序方式】
选手可以在本题目录下使用如下命令编译得到可执行文件:
g++ grader.cpp pudding.cpp -o pudding -O2 -std=c++14 -static
对于编译得到的可执行文件 pudding:
- 可执行文件将从标准输入读入以下格式的数据:
- 第一行包含三个非负整数 。
- 第二行包含 个正整数,分别表示每组测试数据中 的值。
- 可执行文件将输出以下格式的数据至标准输出:
- 若 次调用
find_tastiness的返回值均正确,则:- 输出的第一行为
Correct!。 - 输出的第二行为
Max queries used: Q,其中 表示所有测试数据中调用query_tastiness的次数的最大值。 - 输出的第三行为
Max total puddings queried: S,其中 表示所有测试数据中调用query_tastiness时传入的 的长度之和的最大值。
- 输出的第一行为
- 若至少一次调用
find_tastiness的返回值不正确,则只会输出一行Wrong answer.。
- 若 次调用
- 若调用
query_tastiness时传入的参数不符合要求,或调用次数超过上限,则可执行文件会向 标准错误流 输出错误信息,并返回 。 - 选手可以在运行可执行文件时启用
-v或--verbose参数,此时可执行文件将会额外输出以下内容:- 每次调用
find_tastiness的返回值、正确性、调用query_tastiness的次数与传入的 的长度之和。 - 每次调用
query_tastiness时传入的参数、计算过程以及返回值。 - 程序最终获得的分数比例,具体可见【评分方式】一节。
- 每次调用
输出格式
无
输入输出样例 #1
输入 #1
0 2 197
26 121
输出 #1
Correct!
Max queries used: 2
Max total puddings queried: 5
说明/提示
【样例 解释】
对于第一组测试数据,小 制作的布丁的美味度为 。以下是一种可能的交互过程:
- 调用
query_tastiness(),则 ,因此函数返回 。 - 调用
query_tastiness(),则 ,因此函数返回 。 - 返回 ,答案正确。
- 调用
query_tastiness的次数为 ,调用query_tastiness时传入的 的长度之和为 。
【样例 】
见选手目录下的 pudding/pudding2.in 与 pudding/pudding2.ans。
该样例满足测试点 的约束条件。
【样例 】
见选手目录下的 pudding/pudding3.in 与 pudding/pudding3.ans。
该样例满足测试点 的约束条件。
【样例 】
见选手目录下的 pudding/pudding4.in 与 pudding/pudding4.ans。
该样例满足测试点 的约束条件。
【数据范围】
对于所有测试数据,均有:
- ;
- ,。
::cute-table{tuack}
| 测试点编号 | 分值 | 特殊性质 | ||
|---|---|---|---|---|
| 无 | ||||
| 无 | ||||
特殊性质 : 为质数。
【评分方式】
注意:
- 选手不应当通过非法方式获取交互库的内部信息,如试图直接读取 的值,或直接与标准输入、输出流进行交互。此类行为将被视为作弊。
- 交互库不是适应性的,即每次调用
find_tastiness时, 的值就已经确定,不会随交互过程变化。 - 最终的评测交互库与样例交互库的实现不同。
若
find_tastiness函数的返回值不正确,或调用query_tastiness时传入的参数不符合要求,则相应测试点得 分。 在上述条件基础上: - 对于每个测试点,设 表示所有测试数据中调用
query_tastiness的次数的最大值, 表示所有测试数据中调用query_tastiness时传入的 的长度之和的最大值, 表示该测试点的分值,则程序获得 $\left\lfloor f(Q)\cdot g(S)\cdot\mathrm{score}\right\rfloor$ 分,其中 与 的计算方式如下。
::cute-table{tuack}
::cute-table{tuack}
附件下载
pudding.zip 705.37KB