#P15677. [Bulgarian2023训练营]cells
[Bulgarian2023训练营]cells
原题为函数式交互题;本版本已配置为 Hydro OJ 可测的 grader 形式。
题目描述
你是一位世界著名的生物学家,成功分离出了若干对科学非常重要的细胞。
一共有 个细胞,它们位于 到 之间的不同整数位置上。但由于这些细胞非常微小,你并不知道它们的具体位置。
幸运的是,你可以使用一种会被最近细胞吸引的物质。每次你可以选择一个整数位置 ,并调用函数 get_closest_cells(pos)。该函数会返回距离 最近的细胞位置:
- 如果最近的细胞只有一个,返回包含一个位置的数组;
- 如果有两个细胞到 的距离相同,并且它们同为最近细胞,返回这两个细胞的位置,按升序排列。
你的任务是找出所有细胞的位置,并尽量减少调用次数。
提交要求
你需要提交一个源文件,实现如下函数:
std::vector<int> find_cells(int N, int K);
你的程序需要包含头文件:
#include "cells.h"
你可以调用如下函数来询问最近的细胞:
std::vector<int> get_closest_cells(int pos);
其中 pos 必须满足:
如果调用时 pos 不合法,将得到 Wrong Answer。
函数 find_cells 会被评测程序调用一次,参数分别为位置总数 和细胞数量 。你需要返回一个包含所有细胞位置的 vector<int>,顺序不限。
你的提交文件:
- 不要定义
main函数; - 不要从标准输入读取;
- 不要向标准输出输出;
- 只需实现
find_cells及你需要的辅助函数。
输入格式
选手程序不需要直接读入输入。
评测程序内部会读入测试数据,并调用你的 find_cells(N, K)。
每个测试点的数据格式为:
第一行两个整数 。
第二行 个整数,表示隐藏的细胞位置。
输出格式
选手程序不需要直接输出。
你只需在 find_cells 中返回所有细胞的位置。
限制
所有细胞位置两两不同。
子任务
| 子任务 | 分值 | 限制 |
|---|---|---|
| 1 | 10 | |
| 2 | 90 |
询问次数限制
记调用 get_closest_cells 的次数为 。
在本 Hydro OJ 版本中:
- 子任务 1:只要答案正确即可;
- 子任务 2:要求答案正确且 。
原题对子任务 2 的超限询问有部分分公式;为了适配 Hydro OJ 的普通评测,本版本将其改为硬限制。
本地测试
配置包的 download 目录中提供:
cells.hLgrader.cpp
本地测试时,把你的 cells.cpp 与这两个文件放在同一目录下,然后编译:
g++ -std=c++17 -O2 cells.cpp Lgrader.cpp -o cells
运行后按如下格式输入:
N K
cell_1 cell_2 ... cell_K
如果答案正确,程序会输出类似:
Correct with q queries used.
样例说明
设隐藏数据中 ,两个细胞分别在 和 。
一次可能的过程如下:
| 操作 | 返回值 |
|---|---|
find_cells(10, 2) |
评测程序调用你的函数 |
get_closest_cells(5) |
{7} |
get_closest_cells(8) |
{7, 9} |
return {7, 9} |
成功找到所有细胞 |
样例仅用于说明函数调用方式,实际评测数据是隐藏的。
@下发文件