#P10859. [POI2021 R3]Waga
[POI2021 R3]Waga
题目描述
题目译自 XXIX Olimpiada Informatyczna – III etap Waga
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 处理不同砝码组合,此函数返回整数 ,表示测试数据数量。假设样例中 ,其他测试中 。poloz_lewo(x)
:将贴有数字 的砝码放在左托盘。poloz_prawo(x)
:将贴有数字 的砝码放在右托盘。odloz(x)
:将贴有数字 的砝码从托盘取下放回桌面。以上三函数调用时,无论砝码 之前位置如何都有效,若砝码已在目标位置,则调用无效。wazenie()
:返回 中的一个值,分别表示左托盘重、平衡、右托盘重。odpowiedz(T)
:提交 Bajtazar 的解,需为每个测试数据调用一次。参数T
是一个数组(C/C++ 为std::vector<int>
,Python 为列表),T[0..6]
表示贴有数字 的砝码重量为 。
调用 odpowiedz
后,程序自动进入下一测试数据(托盘清空)。最后一个数据调用后,程序自动结束。
库可能在交互中动态调整砝码重量,但需与之前的 wazenie
结果一致。程序不得打开文件或使用标准输入输出,可用标准错误输出(stderr)。编译命令如下:
- C++:
g++ -O3 -static waglib.cpp wag.cpp
- Python:
python3 wag.py
示例评测程序
示例评测程序及交互库位于「文件」中。这些库可能与正式评测不同,仅用于展示交互方式。
样例 1
以下为样例的运行流程,包含 组测试数据。设 为贴有数字 的砝码重量。
- 第一组数据:贴纸正确(),用 次
wazenie
验证。 - 第二组数据:$w_{1}=2, w_{2}=1, w_{3}=3, w_{4}=7, w_{5}=4, w_{6}=5, w_{7}=6$,若用不超过 次
wazenie
,可得满分。
调用 | 返回值 | 说明 |
---|---|---|
poloz_lewo(1) poloz_lewo(2) poloz_lewo(3) poloz_prawo(7) |
- | 左托盘:;右托盘: |
wazenie() |
1 |
,故 $\left\{w_{1}, w_{2}, w_{3}\right\}=\{1,2,3\}, w_{7}=7$ |
odloz(1) odloz(7) poloz_prawo(4) |
- | 左托盘:;右托盘: |
wazenie() |
-1 |
且 ,故 |
odloz(3) odloz(4) poloz_lewo(4) poloz_prawo(6) |
- | 左托盘:;右托盘: |
wazenie() |
0 |
,,故 ,推得 |
odpowiedz({1,2,3,4,5,6,7}) |
- | 正确提交 ,进入下一组数据,托盘清空 |
poloz_lewo(1) poloz_lewo(2) poloz_lewo(3) poloz_prawo(7) |
左托盘:;右托盘: | |
wazenie() |
0 |
,可能 $\left\{w_{1}, w_{2}, w_{3}\right\}=\{1,2,3\}, w_{7}=6$ 或 |
… | ||
odpowiedz({2,1,3,7,4,5,6}) |
- | 答案正确,程序结束 |
数据范围与提示
设 为单组测试数据中 wazenie
的最大调用次数,得分如下:
子任务 | 条件 | 得分 |
---|---|---|
(Wrong Answer ) |