Bajtazar 刚刚买了一台天平,并配有一套七个砝码,质量分别为 $1, 2, 3, 4, 5, 6$ 和 $7$ 公斤。不幸的是,这些砝码外观完全相同,且上面没有任何标记。
随附的贴纸上印有数字 $1, 2, 3, 4, 5, 6$ 和 $7$,但没有说明应该将哪张贴纸贴在哪个砝码上。目前,Bajtazar 已经按照自己的意愿贴好了贴纸(每个砝码贴一张),但他最终希望每张贴纸都能代表砝码的实际重量。
Bajtazar 想到了一个绝妙的方法:他可以在天平的托盘上放置一些砝码,观察天平向哪一侧倾斜。你能通过少量的称重次数,帮助 Bajtazar 确定贴纸与砝码的正确对应关系吗?
交互
你需要实现一个程序来解决 Bajtazar 的问题,并使用提供的库(模拟天平)进行交互。要在程序中使用该库,请包含以下内容:
- C/C++:
#include "waglib.h" - Python:
from waglib import liczba_testow, poloz_lewo, poloz_prawo, odloz, wazenie, odpowiedz
库提供了以下函数:
liczba_testow()– 在程序的一次运行中,你需要多次帮助 Bajtazar(针对不同的砝码组合)。该函数返回一个整数 $t$,表示当前运行中需要考虑的测试用例数量。你可以假设在示例测试中 $t = 2$,在其余测试中 $t = 5040$。poloz_lewo(x)– 将贴有数字 $x$ ($1 \le x \le 7$) 的砝码放置在天平左盘。poloz_prawo(x)– 将贴有数字 $x$ ($1 \le x \le 7$) 的砝码放置在天平右盘。odloz(x)– 将贴有数字 $x$ ($1 \le x \le 7$) 的砝码放回桌上(即从天平上取下)。 函数poloz_lewo、poloz_prawo和odloz可以在调用前忽略砝码 $x$ 的当前位置。如果砝码已经在你试图放置的位置,则调用该函数不会产生任何效果。wazenie()– 返回集合 $\{-1, 0, 1\}$ 中的一个数字,分别表示:左盘更重、天平平衡、右盘更重。odpowiedz(T)– 该函数用于提交 Bajtazar 问题的解。每个测试用例必须且仅能调用一次。 它接受一个数组 $T[0..6]$(在 C/C++ 中为std::vector<int>,在 Python 中为列表),表示 Bajtazar 临时贴上数字 $i$ 的砝码,其实际重量为 $T[i - 1]$。 调用odpowiedz函数后,程序会自动进入下一个测试用例(特别是,天平上的所有砝码都会被取下)。在最后一个测试用例上执行此函数后,程序将自动终止。
库不需要在与你的程序交互开始时就将贴纸分配给砝码。它可以在交互过程中更改砝码的重量,只要新的重量与之前调用 wazenie 函数的结果保持一致即可。
你的程序不得打开任何文件,也不得使用标准输入和输出。解决方案将使用以下命令与库一起编译:
- C++:
g++ -O3 -static waglib.cpp wag.cpp - Python:
python3 wag.py
子任务
你的程序将在一个测试组中进行测试。
如果 $R$ 是你的程序在单个测试用例中执行 wazenie 函数的最大次数,那么你的解决方案将获得以下分数(如果超过时间限制的一半,分数会相应缩减):
| 次数 | 得分 |
|---|---|
| $R \le 9$ | 每个测试 100 分 |
| $10 \le R \le 15$ | 每个测试 $40 + 10(15 - R)$ 分 |
| $16 \le R \le 25$ | 每个测试 $10 + 3(25 - R)$ 分 |
| $R \ge 26$ | 每个测试 0 分(判为错误答案) |
样例
样例说明
以下是包含 $t = 2$ 个测试用例的示例程序的运行过程。设 $w_i$ 表示贴有数字 $i$ 的砝码的实际重量。
在第一个用例中,贴纸贴得正确(对于每个 $i$,$w_i = i$),我们通过三次调用 wazenie 函数验证了这一点。
在第二个用例中,$w_1 = 2, w_2 = 1, w_3 = 3, w_4 = 7, w_5 = 4, w_6 = 5$ 且 $w_7 = 6$。如果在此用例中我们也最多使用 9 次 wazenie 调用,我们将获得该测试的 100 分。
| 调用 | 结果 | 描述 |
|---|---|---|
poloz_lewo(1) |
||
poloz_lewo(2) |
||
poloz_lewo(3) |
||
poloz_prawo(7) |
— | 左盘 1, 2, 3;右盘 7 |
wazenie() |
$1$ | $w_1 + w_2 + w_3 < w_7$,因此必须有 $\{w_1, w_2, w_3\} = \{1, 2, 3\}$ 且 $w_7 = 7$ |
odloz(1) |
||
odloz(7) |
||
poloz_prawo(4) |
— | 左盘 2, 3;右盘 4 |
wazenie() |
$-1$ | $w_2 + w_3 > w_4$ 且 $w_4 \ge 4$,因此必须有 $w_1 = 1$ 且 $w_4 = 4$ |
odloz(3) |
||
odloz(4) |
||
poloz_lewo(4) |
||
poloz_prawo(6) |
— | 左盘 2, 4;右盘 6 |
wazenie() |
$0$ | $w_2 + 4 = w_6$ 且 $w_2 \in \{2, 3\}$,$w_6 \in \{5, 6\}$,因此必须有 $w_2 = 2, w_6 = 6$,进而 $w_3 = 3$ 且 $w_5 = 5$ |
odpowiedz({1,2,3,4,5,6,7}) |
— | 正确回答 $w_i = i$,进入下一个测试用例;清空天平 |
poloz_lewo(1) |
||
poloz_lewo(2) |
||
poloz_lewo(3) |
||
poloz_prawo(7) |
— | 左盘 1, 2, 3;右盘 7 |
wazenie() |
$0$ | $w_1 + w_2 + w_3 = w_7$,因此必须有 $\{w_1, w_2, w_3\} = \{1, 2, 3\}$ 且 $w_7 = 6$ 或 $\{w_1, w_2, w_3\} = \{1, 2, 4\}$ 且 $w_7 = 7$ |
| ... | ... | ... |
odpowiedz({2,1,3,7,4,5,6}) |
— | 正确回答并结束程序 |