#P10859. [POI2021 R3]Waga

[POI2021 R3]Waga

题目描述

题目译自 XXIX Olimpiada Informatyczna – III etap Waga

Bajtazar 刚买了一台托盘天平和一套七个砝码,重量分别是 1,2,3,4,5,6,71,2,3,4,5,6,7 公斤。可惜这些砝码外形一模一样,上面也没有任何标记。套装里附带了标有 1177 的贴纸,但没有说明该贴在哪个砝码上。Bajtazar 先随意贴上了贴纸(每个砝码一张),但他希望最终每个贴纸都能准确反映砝码的重量。

他灵机一动,想出了一个妙招:通过在天平上称重,观察托盘倾斜的方向,就能推断出砝码的真实重量。请你帮助 Bajtazar 用尽量少的称重次数,正确匹配砝码和贴纸。

交互方式

你需要编写一个程序,通过提供的库(模拟天平)解决 Bajtazar 的问题。使用库的方法如下:

  • C/C++: #include "waglib.h"
  • Python: from waglib import liczba_testow, poloz_lewo, poloz_prawo, odloz, wazenie, odpowiedz

库提供以下函数:

  • liczba_testow():程序运行时需多次帮助 Bajtazar 处理不同砝码组合,此函数返回整数 tt,表示测试数据数量。假设样例中 t=2t=2,其他测试中 t=5040t=5040
  • poloz_lewo(x):将贴有数字 xx (1x7)(1 \leq x \leq 7) 的砝码放在左托盘。
  • poloz_prawo(x):将贴有数字 xx (1x7)(1 \leq x \leq 7) 的砝码放在右托盘。
  • odloz(x):将贴有数字 xx (1x7)(1 \leq x \leq 7) 的砝码从托盘取下放回桌面。以上三函数调用时,无论砝码 xx 之前位置如何都有效,若砝码已在目标位置,则调用无效。
  • wazenie():返回 {1,0,1}\{-1, 0, 1\} 中的一个值,分别表示左托盘重、平衡、右托盘重。
  • odpowiedz(T):提交 Bajtazar 的解,需为每个测试数据调用一次。参数 T 是一个数组(C/C++ 为 std::vector<int>,Python 为列表),T[0..6] 表示贴有数字 ii 的砝码重量为 T[i1]T[i-1]

调用 odpowiedz 后,程序自动进入下一测试数据(托盘清空)。最后一个数据调用后,程序自动结束。

库可能在交互中动态调整砝码重量,但需与之前的 wazenie 结果一致。程序不得打开文件或使用标准输入输出,可用标准错误输出(stderr)。编译命令如下:

  • C++: g++ -O3 -static waglib.cpp wag.cpp
  • Python: python3 wag.py

示例评测程序

示例评测程序及交互库位于「文件」中。这些库可能与正式评测不同,仅用于展示交互方式。

样例 1

以下为样例的运行流程,包含 t=2t=2 组测试数据。设 wiw_{i} 为贴有数字 ii 的砝码重量。

  • 第一组数据:贴纸正确(wi=iw_{i}=i),用 33wazenie 验证。
  • 第二组数据:$w_{1}=2, w_{2}=1, w_{3}=3, w_{4}=7, w_{5}=4, w_{6}=5, w_{7}=6$,若用不超过 99wazenie,可得满分。
调用 返回值 说明
poloz_lewo(1)
poloz_lewo(2)
poloz_lewo(3)
poloz_prawo(7)
- 左托盘:1,2,31,2,3;右托盘:77
wazenie() 1 w1+w2+w3<w7w_{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,32,3;右托盘:44
wazenie() -1 w2+w3>w4w_{2}+w_{3} > w_{4}w44w_{4} \geq 4,故 w1=1,w4=4w_{1}=1, w_{4}=4
odloz(3)
odloz(4)
poloz_lewo(4)
poloz_prawo(6)
- 左托盘:2,42,4;右托盘:66
wazenie() 0 w2+4=w6w_{2}+4 = w_{6}w2{2,3},w6{5,6}w_{2} \in \{2,3\}, w_{6} \in \{5,6\},故 w2=2,w6=6w_{2}=2, w_{6}=6,推得 w3=3,w5=5w_{3}=3, w_{5}=5
odpowiedz({1,2,3,4,5,6,7}) - 正确提交 wi=iw_{i}=i,进入下一组数据,托盘清空
poloz_lewo(1)
poloz_lewo(2)
poloz_lewo(3)
poloz_prawo(7)
左托盘:1,2,31,2,3;右托盘:77
wazenie() 0 w1+w2+w3=w7w_{1}+w_{2}+w_{3} = w_{7},可能 $\left\{w_{1}, w_{2}, w_{3}\right\}=\{1,2,3\}, w_{7}=6$ 或 {1,2,4},w7=7\{1,2,4\}, w_{7}=7
odpowiedz({2,1,3,7,4,5,6}) - 答案正确,程序结束

数据范围与提示

RR 为单组测试数据中 wazenie 的最大调用次数,得分如下:

子任务 条件 得分
11 R9R \leq 9 100100
22 10R1510 \leq R \leq 15 40+10(15R)40+10(15-R)
33 16R2516 \leq R \leq 25 10+3(25R)10+3(25-R)
44 R26R \geq 26 00Wrong Answer