#P6047. 「BalticOI 2021 Day2」The Collection Game
「BalticOI 2021 Day2」The Collection Game
题目背景
一座美术馆有 个房间,编号为 到 。每个房间中展示着一件艺术收藏品。所有收藏品的审美价值互不相同,但你一开始并不知道它们的相对顺序。
你可以多次参观美术馆。每次参观前,你可以预先安排若干对房间进行比较。一次参观中,同一个房间不能出现在两次比较里。
在你安排比较后、真正参观前,美术馆可能会对每一对被安排比较的房间,临时交换这两个房间中的收藏品。随后你会得到每一对比较的结果,即哪一个房间中的收藏品审美价值更高。
你的任务是在不超过 次参观内,确定最后一次参观时美术馆各房间中收藏品的审美价值从高到低的顺序。
交互 / 库函数说明
本题在 Hydro OJ 中配置为交互题。选手程序不直接读入数据,也不直接输出答案,只需要实现指定函数。
C++ 选手需要在程序开头包含:
#include "swaps.h"
你需要实现如下函数:
void solve(int N, int V);
评测器会对每个测试点调用一次 solve(N, V)。
在 solve 中,你可以调用以下函数。
void schedule(int i, int j)
安排在下一次参观时比较房间 和房间 中的收藏品,其中必须满足:
在同一次参观,也就是两次 visit() 调用之间,任意一个房间最多只能出现在一次 schedule 调用中。
调用 schedule(i,j) 后,评测器可能会立刻交换房间 和房间 中的收藏品。
std::vector<int> visit()
进行一次参观,并执行自上一次 visit() 以来安排的所有比较。
该函数返回一个数组,长度等于这次参观前安排的比较次数。返回数组中第 个值对应第 次 schedule 安排的比较:
- 返回值为
1:表示当时房间 中收藏品的审美价值高于房间 ; - 返回值为
0:表示当时房间 中收藏品的审美价值低于房间 。
调用 visit() 的次数不能超过 。
void answer(std::vector<int> r)
提交最终答案。r 必须是长度为 的数组,表示最后一次参观时,房间按收藏品审美价值从高到低排序后的编号。
也就是说,r[0] 应为当前收藏品审美价值最高的房间编号,r[1] 应为第二高的房间编号,依此类推。
调用 answer 后程序会立即结束。你必须恰好调用一次 answer。
重要限制
如果出现以下情况,该测试点会判为错误:
schedule的参数不合法;- 同一次参观中,同一个房间被安排比较超过一次;
visit()调用次数超过 ;answer的数组长度不是 ;answer中出现非法房间编号、重复房间编号或顺序错误;- 选手程序向标准输出写入额外内容。
选手程序不要实现 main 函数,也不要使用标准输入输出与评测器通信。
样例交互说明
考虑 ,,初始时房间按审美价值从高到低的顺序为 。评测器会调用:
solve(4, 50);
一种可能的交互过程如下:
| 选手程序调用 | 返回值 | 说明 |
|---|---|---|
schedule(1, 2) |
安排比较房间 1 和 2。 | |
schedule(3, 4) |
安排比较房间 3 和 4。 | |
| 美术馆可能交换房间 3 和 4 的收藏品。 | ||
visit() |
{1, 0} |
房间 1 的收藏品高于房间 2;房间 4 的收藏品高于房间 3。 |
schedule(2, 4) |
安排比较房间 2 和 4。 | |
visit() |
{1} |
房间 2 的收藏品高于房间 4。 |
answer({1, 2, 4, 3}) |
提交最终顺序。 |
数据范围
对于所有测试点:
子任务如下:
| 子任务 | 分值 | 限制 |
|---|---|---|
| 1 | 5 | ,且美术馆从不交换收藏品。 |
| 2 | 10 | ,且美术馆从不交换收藏品。 |
| 3 | 5 | ,。 |
| 4 | 15 | 。 |
| 5 | 。 | |
| 6 | 35 | 。 |
| 7 | 15 | 。 |
此外,对于子任务 3 到 7,每个子任务中还有一部分测试点满足:每次调用 schedule(i,j) 后,美术馆总是把审美价值更高的收藏品放入房间 。
提交格式示例
#include "swaps.h"
#include <bits/stdc++.h>
using namespace std;
void solve(int N, int V) {
// 在这里实现你的算法
}
@下发文件