Python 我对我在codeforces上解决的一个编程问题感到困惑,我认为这个问题本身是错误的

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个命令的序列,机器人处理了它。在这个序列之

这是问题陈述

伊万有一个位于无限网格上的机器人。最初,机器人站在起始单元(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个命令的序列,机器人处理了它。在这个序列之后,机器人最终进入了起始单元(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)