QOJ.ac

QOJ

Limite de temps : 10 s Limite de mémoire : 256 MB Points totaux : 100 Interactif

#10633. Waga

Statistiques

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_lewopoloz_prawoodloz 可以在调用前忽略砝码 $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}) 正确回答并结束程序

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.