QOJ.ac

QOJ

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

#203. 洗牌

Statistics

注意:本题仅支持使用 C++ 和 Java 语言。

Lim Li 热爱动漫,最近从亚马逊购买了一整季的《干物妹!小埋》。这 $N$ 集动画存放在 $N$ 张 CD 中,每张 CD 包含一集。CD 的标签编号为 $1, \dots, N$,而动画剧集的编号也为 $1, \dots, N$。她准备开始观看时,却发现由于制造故障,剧集编号与 CD 上的标签并不匹配!

她立即联系了亚马逊,对方告知虽然 CD 标签与剧集编号不匹配,但这些剧集只是被打乱了顺序,集合中没有任何一集缺失。为了避免剧透,Lim Li 不愿亲自播放 CD 来确定每张 CD 中存放的是哪一集。

因此,Lim Li 决定寻求她的朋友——猫咪 Rar 的帮助。她将遵循以下流程:

  • Lim Li 将她的 CD 分成 $B$ 个盒子,每个盒子装有 $K$ 张 CD。($N = B \times K$)
  • 这些盒子会被运送给 Rar。在运输过程中,每个盒子内的 CD 可能会发生位移,盒子本身的顺序也可能发生改变。因此,每个盒子内 CD 的顺序以及盒子本身的顺序在运输过程中都可能被打乱。
  • Rar 收到盒子后,会在他自己的 CD 播放器上播放这些 CD。
  • Rar 会记录下他在每个盒子中发现的剧集集合,并将这些信息写在 $B$ 张独立的纸条上发送回给 Lim Li。每张纸条上写有 $K$ 个整数,即该盒子内 CD 所对应的剧集编号。
  • 整套 $N$ 张 CD 会被退还给 Lim Li。

此过程最多可执行 $Q$ 次,超过次数后 Rar 会感到厌烦并停止帮助她。请帮助 Lim Li 在 Rar 的最少帮助下确定每张 CD 中的剧集编号。

实现细节

这是一道交互题。请勿从标准输入读取数据或向标准输出写入数据。

你需要实现以下函数:

  • C++: vector<int> solve(int N, int B, int K, int Q, int ST)
  • Java: public int[] solve(int N, int B, int K, int Q, int ST)

solve 函数将被调用且仅被调用一次。

你可以调用以下评测库函数来完成任务:

  • C++: vector<vector<int>> shuffle(vector<vector<int>> boxes)
  • Java: public static int[][] shuffle(int[][] boxes)

调用 shuffle 函数时需传入一个二维数组 boxes,描述 Lim Li 将 $N$ 张 CD 分组为 $B$ 个盒子的方案。boxes 的格式应为包含 $B$ 个一维数组,每个一维数组包含 $K$ 个整数,代表盒子内 CD 的标签。如果你的程序调用此函数的次数超过 $Q$ 次,或传入了无效参数,程序将立即终止并获得 Wrong Answer 判决。

传递给 shuffle 函数的数组不会被修改。换句话说,在调用 shuffle 函数后,你可以预期二维数组 boxes 保持不变。

shuffle 函数将返回一个二维数组,描述 Rar 提供的信息。该二维数组由 $B$ 个一维数组组成,每个数组包含 $K$ 个整数,描述了盒子内 CD 对应的剧集编号。

样例

假设 $N = 6, B = 3, K = 2, Q = 100$,且测试用例属于子任务 2。剧集顺序为 $[3, 1, 4, 5, 2, 6]$。你的函数将被调用,参数如下:

solve(6, 3, 2, 100, 2)

一种可能的交互过程如下:

  • shuffle([[1, 2], [3, 4], [5, 6]]) = [[6, 2], [5, 4], [3, 1]] 二维数组 [[1, 2], [3, 4], [5, 6]] 代表 Lim Li 发送的三个盒子中的 CD 标签。由于盒子顺序被打乱且每个盒子内的 CD 也被打乱,Rar 收到的盒子可能对应二维数组 [[6, 5], [4, 3], [1, 2]]。Rar 找到这些 CD 标签对应的剧集并报告 [[6, 2], [5, 4], [3, 1]]

  • shuffle([[2, 6], [3, 1], [5, 4]]) = [[6, 1], [2, 5], [4, 3]] 由于盒子被打乱,Rar 收到的盒子可能对应二维数组 [[6, 2], [5, 4], [3, 1]]。Rar 找到这些 CD 标签对应的剧集并报告 [[6, 1], [2, 5], [4, 3]]

  • shuffle([[6, 5], [4, 2], [3, 1]]) = [[5, 1], [3, 4], [2, 6]] 由于盒子被打乱,Rar 收到的盒子可能对应二维数组 [[4, 2], [1, 3], [5, 6]]。Rar 找到这些 CD 标签对应的剧集并报告 [[5, 1], [3, 4], [2, 6]]

此时,你的程序认为已获得足够信息,并推断出剧集顺序为 $[3, 4, 1, 5, 2, 6]$。因此,你的程序将返回 $[3, 4, 1, 5, 2, 6]$。由于剧集顺序正确,且程序使用的查询次数少于 100 次,该测试用例将被判定为正确。

子任务

每个实例的最大执行时间为 1.0 秒。对于所有测试用例,输入满足以下界限:

  • $B, K \ge 2$
  • $N \ge 6$
  • $N = B \times K$

你的程序将在满足以下限制的输入实例上进行测试:

子任务 分数 附加限制
1 2 $N = 6, B = 2, K = 3, Q = 100$
2 3 $N = 6, B = 3, K = 2, Q = 100$
3 12 $N \le 1000, Q = 12$。$B$ 个盒子的顺序保持不变。
4 16 $N \le 1000, K = 2, Q = 4$
5 15 $N \le 1000, B = 2, Q = 12$
6 52 $N \le 1000, Q = 2000, B, K > 2$。请阅读“评分”部分了解详情。

评分

子任务 6 是一个特殊的评分子任务。你的得分取决于你在任何测试用例中进行的最大查询次数 $q$。

  • 如果 $q > 2000$,你将获得 0 分。
  • 如果 $500 < q \le 2000$,你将获得 8 分。
  • 如果 $50 < q \le 500$,你将获得 17 分。
  • 如果 $9 < q \le 50$,你将获得 $22 + 30 \times (\frac{50-q}{41})^2$ 分。
  • 如果 $q \le 9$,你将获得 52 分。

测试

你可以从附件中下载评测库文件、头文件(针对 C++)和解决方案模板。样例测试用例也一并提供以供参考。请使用提供的编译和运行脚本(.sh 文件)进行测试。

评测输入格式

  • 第一行包含五个整数 $N, B, K, Q$ 和 $ST$,其中 $ST$ 是子任务编号。
  • 第二行包含 $N$ 个整数,即剧集 $E_1, E_2, \dots, E_N$。

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.