CDOJ 300 木杆上的蚂蚁

Description

在一根细木杆上,有一些速度相同蚂蚁,它们有的往左走,有的往右走,木杆很细,只允许一只蚂蚁通过,所以当两只蚂蚁碰头的时候,它们会掉头继续前进,直到走出边界,掉下木杆。

已知木杆的长度和每只蚂蚁的名字、位置和初始方向,问依次掉下木杆的蚂蚁花费的时间以及它的名字。

Standard Input

输入包含多组测试数据。

第一行包含一个整数T(T≤20),代表测试数据组数。

每组测试数据的第一行包含两个整数N, L,表示有N只蚂蚁(N≤100),木杆长度为L(L≤1000)。假设蚂蚁每秒前进一个单位距离,掉头转向的时间忽略不计。

以下N行,每行依次为蚂蚁的名字(长度不超过10,仅由英文字母组成),初始位置p(0

Standard Output

对于第k组测试数据,首先输出一行为Case #k:

然后输出N行,给出依次掉下木杆的蚂蚁花费的时间以及它的名字,以单个空格分隔。
(按照掉下木杆的先后顺序输出,数据保证不会有两支蚂蚁同时掉下木杆)。

Samples

Input Output
2
2 5
GG 1 L
MM 3 R
2 5
GG 1 R
MM 2 L
Case #1:
1 GG
2 MM
Case #2:
2 GG
4 MM

解题思路

由于蚂蚁速度相同,故碰撞后掉头碰撞后穿过对方,且名字互换这两种情况等价。显然,掉出杆子的蚂蚁,其名字仍然为最开始在杆两端的蚂蚁的某一只(这一点在不做等价变换时易得),但掉下的顺序会发生改变,其原因是发生了碰撞,或者该原因也可以等价为最先穿过其他蚂蚁到达杆端的那只蚂蚁,它所走的方向不一定与不发生碰撞时杆端先掉落的那一只蚂蚁所在的方向一致

由于网上题解大多是C语言实现的,现给出python解法如下。

t = 0
t = int(input())
for i in range(1, t + 1):
    n = 0
    l = 0
    n, l = map(int, input().split())
    queue = []
    posit = []
    cnt = n
    while cnt:
        tmp = []
        tmp.append(list(input().split()))
        tmp.append(int(tmp[0][1]) if tmp[0][2] == 'L' else l - int(tmp[0][1]))
        tmp.append(0 if tmp[0][2] == 'L' else -1)
        posit.append(tmp.pop(0))
        queue.append(tmp)
        tmp = []
        tmp.append(int(posit[-1][1]))
        tmp.append(posit[-1][0])
        posit.pop()
        posit.append(tmp)
        cnt = cnt - 1
    print("Case #", i, ':', sep = '')
    queue.sort()
    posit.sort()
    for j in queue:
        print(j[0], (posit.pop(j[1]))[1])

你可能感兴趣的:(算法,python,算法,acm竞赛)