Python 我对我在codeforces上解决的一个编程问题感到困惑,我认为这个问题本身是错误的
这是问题陈述 伊万有一个位于无限网格上的机器人。最初,机器人站在起始单元(0, 0). 机器人可以处理命令。它可以执行四种类型的命令:Python 我对我在codeforces上解决的一个编程问题感到困惑,我认为这个问题本身是错误的,python,Python,这是问题陈述 伊万有一个位于无限网格上的机器人。最初,机器人站在起始单元(0, 0). 机器人可以处理命令。它可以执行四种类型的命令: U — move from the cell (x, y) to (x, y + 1); D — move from (x, y) to (x, y - 1); L — move from (x, y) to (x - 1, y); R — move from (x, y) to (x + 1, y). 伊万输入了n个命令的序列,机器人处理了它。在这个序列之
U — move from the cell (x, y) to (x, y + 1);
D — move from (x, y) to (x, y - 1);
L — move from (x, y) to (x - 1, y);
R — move from (x, y) to (x + 1, y).
伊万输入了n个命令的序列,机器人处理了它。在这个序列之后,机器人最终进入了起始单元(0, 0),但伊万怀疑序列是否正确执行后,机器人会在同一个单元中结束。他认为机器人忽略了一些命令。要确认机器人是否被严重窃听,他需要计算正确执行的最大可能命令数。帮伊凡做计算!
输入
第一行包含一个数字n——Ivan输入的命令序列长度(1 ≤ N ≤ 100)
第二行包含序列本身——一个由n个字符组成的字符串。每个字符可以是U、D、L或R。
输出
从机器人可以执行的序列中打印最大可能数量的命令,以在起始单元格中结束
一些测试示例:
输入:
四,
阿尔杜尔
输出:
四,
输入:
五,
瑞鲁
输出:
0
输入:
六,
LLRRRR
输出:
四,
这是我写的解决方案,它通过了前3个测试用例,在测试用例4中给出了错误的输出(40)
测试用例4的输入如下
88
LLUULRDRRURDDDLURLRDRLLRULRUUDLLLRRDDURRDURRRLDRRRULDDDRURDLURDRULURDDDLDR
现在我想知道为什么正确答案是76,因为在第76个命令值cor=[0,0]表示它甚至没有到达原点。
只有在第40个命令时,cor==[0,0]它们都是0,这是测试用例从0到88的最大值
这是我的节目:
a = int(input())
ans = input()
cor = [0,0]
arr = [0]
for i in range(a):
if ans[i]=='L':
cor[0]-=1
elif ans[i]=='R':
cor[0]+=1
elif ans[i]=='U':
cor[1]+=1
elif ans[i]=='D':
cor[1]-=1
if cor[0]==0 and cor[1]==0:
arr.append(i+1)
print(max(arr))
你太复杂了 机器人总是在原点结束。如果命令不是这样,那么它必须跳过其中的一些命令 我们不需要手动计算这些命令,它们的顺序也不是特别重要——我们需要知道的是
- 要返回原点,“D”和“U”命令的数量必须相同
- 要返回原点,“L”和“R”命令的数量必须相同
inp = "LLUUULRDRRURDDLURRLRDRLLRULRUUDDLLLLRRDDURDURRLDURRLDRRRUULDDLRRRDDRRLUULLURDURUDDDDDLDR"
ct_l = inp.count('L') # 20
ct_u = inp.count('U') # 18
ct_r = inp.count('R') # 28
ct_d = inp.count('D') # 22
num_skipped = abs(ct_l - cd_r) + abs(ct_d - ct_u) # 8 + 4 = 12
solution = len(inp) - num_skipped) # 88 - 12 = 76
print(solution)
在您介绍的解决方案中,您的
arr
并不特别重要。我相信,如果你浏览了整个命令串,那么len(a)-abs(cor[0])+abs(cor[1])
就会得到正确的答案。不一定是序列中最后一个没有执行的命令。是的,我想a-abs(cor[0])+abs部分已经谢谢你了!实际上要简单得多:只需执行solution=2*(min(ct\u l,ct\u r)+min(ct\u,ct\u d)
)