P12924 [POI 2021/2022 R3] 天平 / Waga【交互库暂未配置】

题目背景

翻译来自于 [LibreOJ](https://loj.ac/p/4861)。

题目描述

**题目译自 [XXIX Olimpiada Informatyczna – III etap](https://sio2.mimuw.edu.pl/c/oi29-3/dashboard/) [Waga](https://szkopul.edu.pl/problemset/problem/dd4KmATYng1s8UbSvaXmqlHX/statement/)** Bajtazar 刚买了一台托盘天平和一套七个砝码,重量分别是 $1,2,3,4,5,6,7$ 公斤。可惜这些砝码外形一模一样,上面也没有任何标记。套装里附带了标有 $1$ 到 $7$ 的贴纸,但没有说明该贴在哪个砝码上。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 \leq x \leq 7)$ 的砝码放在左托盘。 - `poloz_prawo(x)`:将贴有数字 $x$ $(1 \leq x \leq 7)$ 的砝码放在右托盘。 - `odloz(x)`:将贴有数字 $x$ $(1 \leq x \leq 7)$ 的砝码从托盘取下放回桌面。以上三函数调用时,无论砝码 $x$ 之前位置如何都有效,若砝码已在目标位置,则调用无效。 - `wazenie()`:返回 $\{-1, 0, 1\}$ 中的一个值,分别表示左托盘重、平衡、右托盘重。 - `odpowiedz(T)`:提交 Bajtazar 的解,需为每个测试数据调用一次。参数 `T` 是一个数组(C/C++ 为 `std::vector`,Python 为列表),`T[0..6]` 表示贴有数字 $i$ 的砝码重量为 $T[i-1]$。 调用 `odpowiedz` 后,程序自动进入下一测试数据(托盘清空)。最后一个数据调用后,程序自动结束。 库可能在交互中动态调整砝码重量,但需与之前的 `wazenie` 结果一致。程序不得打开文件或使用标准输入输出,可用标准错误输出(stderr)。编译命令如下: - C++: `g++ -O3 -static waglib.cpp wag.cpp` - Python: `python3 wag.py`

输入格式

输出格式

说明/提示

示例评测程序及交互库位于「文件」中。这些库可能与正式评测不同,仅用于展示交互方式。 以下为样例的运行流程,包含 $t=2$ 组测试数据。设 $w_{i}$ 为贴有数字 $i$ 的砝码重量。 - **第一组数据**:贴纸正确($w_{i}=i$),用 $3$ 次 `wazenie` 验证。 - **第二组数据**:$w_{1}=2, w_{2}=1, w_{3}=3, w_{4}=7, w_{5}=4, w_{6}=5, w_{7}=6$,若用不超过 $9$ 次 `wazenie`,可得满分。 | 调用 | 返回值 | 说明 | |-------------------------------------------|--------|----------------------------------------------------------------------| | `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}$,故 $\left\{w_{1}, w_{2}, w_{3}\right\}=\{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} \geq 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}$,可能 $\left\{w_{1}, w_{2}, w_{3}\right\}=\{1,2,3\}, w_{7}=6$ 或 $\{1,2,4\}, w_{7}=7$ | | … | … | … | | `odpowiedz({2,1,3,7,4,5,6})` | - | 答案正确,程序结束 | 设 $R$ 为单组测试数据中 `wazenie` 的最大调用次数,得分如下: | 子任务 | 条件 | 得分 | |:-:|:-:|:-:| | $1$ | $R \leq 9$ | $100$ | | $2$ | $10 \leq R \leq 15$ | $40+10(15-R)$ | | $3$ | $16 \leq R \leq 25$ | $10+3(25-R)$ | | $4$ | $R \geq 26$ | $0$ |