全部博文(118)
分类: C/C++
2008-05-30 17:51:44
城市被划分成R*C的网格,各行从上到下编号为1~R,各列从左到右编号为1~C。每个格子为空地、障碍物和建筑物之一(公司总是位于某个建筑物格子中,且不同的公司总是在不同的建筑物格中)。维修队每次只能往上(行编号减1)、下(行编号加1)、左(列编号减1)、右(列编号加1)四个方向移动,第i支维修队每个小时可以移动s(i)格。维修队在任何时候都不能位于障碍物中,但建筑物可以从它上下左右的相邻空地进入,也可以从这些格子出去。注意:不能直接从一个建筑物格移动到另一个建筑物格,而必须先移动到相邻的空地,在空地上移动,然后再进入另一个建筑物。每个格子的实际尺寸很大,因此可以有多个维修队同时在同一个格子中。第i家公司的位置为(r(i), c(i)),瘫痪程度为B(i),每小时的经济损失为P(i)元。瘫痪程度的单位是“队·小时”,即一支维修队每小时可以把一个公司的瘫痪程度降低1,而如果m支维修队同时为一个公司修复,每小时可以把该公司的瘫痪程度降低m。注意,在完全修复之前,每个小时的经济损失不变。
1. REST
该命令不进行任何操作。
2. MOVE
按照seq进行移动。其中seq为一个长度不超过s(i)的非空字符串(如果不需要移动,请使用REST命令)。如果seq的长度超过s(i),则从第s(i)+1个字符开始的剩余部分将被删除;如果该命令不能完全成功的执行,则从第一个非法移动开始的所有后续移动将被忽略。 seq的取值范围为:U,D,L,R。分别表示上、下、左、右。字符区分大小写, 其他字符视为非法。
3. REPAIR
对当前公司进行维修。如果当前公司已经修复或者该维修队的当前位置不是公司,该命令将被忽略。该命令后面加的所有参数将被忽略。
需要特别注意的是,每个小时只能执行一条指令,例如不能在MOVE之后立刻REPAIR,必须等待下一个小时。
输入格式
输入的第一行为三个正整数R, C, T即网格的行数、列数和自动修复系统的启用时间。以下R行每行C个字符,表示该城市的地图。点表示空地,#表示障碍物,O表示建筑物。 下一行包含一个正整数k,表示公司的数目。以下k行每行四个整数r, c, B, P,其中(r,c)表示该公司坐标(1<=r<=R, 1<=c<=C),B为该公司的初始瘫痪程度,P为每小时的经济损失。(r,c)处保证为一个建筑物格。B和P均为正整数,且P不超过200。 下一行包含一个正整数n,表示维修队的个数。以下n行每行包含三个整数r, c, s,(r,c)表示该维修队的初始位置, s表示它每小时最多移动的格子数。维修队按照输入文件中的顺序编号为1~n。
输出格式
输出每n行为一组,描述一个小时各维修队的发出的命令。共T组,一共n*T行。所有格式非法的指令将被忽略(等效于REST)。尽管如此,如果程序输出不足n*T行,或者命令中没有REPAIR,或者所有的REPAIR都没有成功执行,则输出将视为非法。你的程序不必输出最优解,任何一个合法解都将得到一定的分数。
输入样例
4 7 5
...#OO#
#.....#
O...##O
#......
2
1 5 1 5
3 7 4 6
3
4 7 5
1 1 5
3 1 5
输出样例
MOVE U
MOVE RRRD
MOVE RDRURD
REPAIR
MOVE DRRU
MOVE DRRRU
REPAIR
REPAIR
REPAIR
REPAIR
MOVE DRUL
REPAIR
SLEEP
REPAIR
REST
模拟器
为了更清晰的说明规则并帮助选手设计和测试程序,命题组开发了一个简单的。该模拟器根据输入数据和程序输出进行模拟,并给出详细过程和最后的结果。最终的测试将严格按照该脚本的输出进行评判。你可以用它测试样例输入和输出,或者自己设计的其他数据。模拟器将会对各条非法指令给出警告信息(例如非法的移动,无法识别的指令等)。
每小时的模拟过程如下:
第一步:对于每个尚未修复的公司i,将P(i)累加进总损失。
第二步:按照序列从小到大的顺序依次执行各维修队的指令。
评分规则