#P2547. No Tipping
No Tipping
本题没有可用的提交语言。
描述
正如阿基米德所发现的,当把一个物体放在杠杆臂上时,它会围绕杠杆的支点产生一个扭转力。这种扭转力被称作扭矩,其大小等于物体的重量乘以它到支点的距离(虽然杠杆的角度也会对扭矩产生影响,但在本题中我们暂不考虑)。若物体位于支点左侧,扭矩方向为逆时针;若位于支点右侧,则为顺时针。要计算围绕某个支撑点的总扭矩,只需将杠杆上各个物体所产生的扭矩相加即可。
本题的挑战在于,在调整杠杆上物体的同时,要保证杠杆始终保持平衡。假设你有一块长米、重千克的均匀直木板。木板的中心即为其质心,我们将此位置标记为。因此,木板上的位置范围是从(左端)到(右端)。木板在位置和处由两个高度均为米且立于平坦地面的相同支点支撑。木板上有六个包裹,它们的位置分别为、、、、和,对应的重量分别是千克、千克、千克、千克、千克和千克,如下图所示。
你的任务是逐个移除包裹,并且要确保在移除过程中木板始终依靠两个支点保持平衡,不会发生倾斜。若围绕左支点的净扭矩(由包裹和木板自身重量产生)为逆时针方向,或者围绕右支点的净扭矩为顺时针方向,木板就会倾斜。此问题的一个可行解决方案是:先移除位置为的包裹,接着移除位置为的包裹,再移除位置为的包裹,然后移除位置为的包裹,之后移除位置为的包裹,最后移除位置为的包裹。
你需要编写一个程序来解决上述类似的问题。
输入
输入包含多组测试用例。每组用例的开头是三个整数:木板的长度(单位:米,至少为)、木板的重量(单位:千克)以及木板上包裹的数量()。木板在位置和处由两个高度均为米且立于平坦地面的相同支点支撑。接下来的行,每行包含两个整数,分别表示包裹在木板上的位置(单位:米,以中心为原点,负数表示在左侧)和包裹的重量(单位:千克)。当输入一行三个时,表示输入结束。
输出
对于每组用例,你需要按照如下格式输出用例编号,然后输出行,每行包含两个整数,分别是包裹的位置和重量,且这些包裹的移除顺序需保证木板不会倾斜。若某组用例不存在可行的解决方案,则输出一行 “Impossible”。若初始状态下木板就无法保持平衡,则该用例无解。
输入数据 1
20 3 6
-8 4
-4 10
-3 10
2 4
5 7
8 8
20 3 15
1 10
8 5
-6 8
5 9
-8 4
8 10
-3 10
-4 5
2 9
-2 2
3 3
-3 2
5 1
-6 1
2 5
30 10 2
-8 100
9 91
0 0 0
输出数据 1
Case 1:
-4 10
8 8
-8 4
5 7
-3 10
2 4
Case 2:
1 10
8 5
-6 8
5 9
-8 4
8 10
-3 10
-4 5
2 9
-2 2
3 3
-3 2
5 1
-6 1
2 5
Case 3:
Impossible
来源
滑铁卢地区赛 2001.06.02