超级卡在USACO坏项链问题上

2024-04-26 10:11:00 发布

您现在位置:Python中文网/ 问答频道 /正文

作为前言,这个问题以前被问过。然而,有人用不同的语言或不同的方法询问它,我宁愿理解我的代码的问题,而不是复制粘贴公认的解决方案


因此,就上下文而言,问题是这样的:

给定一串类似rwbbwrbwbrwbrb的珠子,找出一种颜色(字母)的连续珠子的最大长度,然后是另一种颜色(字母)的珠子,注意白色可以被视为红色或白色

例如,wwwbbrwrbrbrrbrbrwrwwrbwrwrrb应该返回11,因为您可以在wwwbbrwrbrbrrbrbrwrwwrb之后断开项链,使其具有wrwrrbwwwbb(请记住,项链在其自身上循环,而不像列表),其颜色最终为rrrrrbbbbbb

我的代码(我剥离了所有I/O部分以简化它)的测试用例rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr长度77

necklace = "rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr"
length = 77
necklace *= 2
maxes = []
for index, bead in enumerate(necklace[0: length]):
    firstStreak = 1
    i = 1
    while i < length and (necklace[index + i] == bead or necklace[index + i] == "w"):
        i += 1
        firstStreak += 1
    secondStreak = 0
    while i < length and necklace[index + i] != bead:
        i += 1
        secondStreak += 1
    maxes.append(firstStreak + secondStreak)
print(max(maxes))

这将输出73,正确答案是74

这段代码在前面的两个测试用例(wwwbbrwrbrbrrbrbrwrwwrbwrwrrbrrr)上都有效

我也非常感谢您对我没有遵循的最佳实践/结构的任何反馈


Tags: 代码index颜色字母测试用例length珠子白色
2条回答

收回:阿利斯泰尔的答案更好&;这个程序仍然不考虑从w开始

没关系,我解决了。解决方案是向后迭代列表。这是我的完整实现

fin = open('beads.in', 'r')
lineList = [line.rstrip('\n') for line in fin]
fout = open('beads.out', 'w')
necklace = lineList[1]
length = int(lineList[0])
necklace *= 3
maxes = []
for index, bead in enumerate(necklace[0: length]):
    firstStreak = 1
    i = 1
    while i < length and (necklace[index + i] == bead or necklace[index + i] == "w"):
        i += 1
        firstStreak += 1
    secondStreak = 0
    while i < length and necklace[index + i] != bead:
        i += 1
        secondStreak += 1
    maxes.append(firstStreak + secondStreak)

for index, bead in enumerate(reversed(necklace[length: length * 2])):
    firstStreak = 0
    i = 1
    while i < length and (necklace[index + i] == bead or necklace[index + i] == "w"):
        i += 1
        firstStreak += 1
    secondStreak = 0
    while i < length and necklace[index + i] != bead:
        i += 1
        secondStreak += 1
    maxes.append(firstStreak + secondStreak)
fout.write(str(max(maxes)) + '\n')

我认为当你开始看“w”时,你只需要处理这个问题。我的解决方案是无论如何都要开始计数,并在循环中遇到下一个非w时决定它应该是什么

necklace = "rwrwrwrwrwrwrwrwrwrwrwrwbwrwbwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwrwr"
length = len(necklace)
necklace *= 2
maxes = []
for index, bead in enumerate(necklace[0: length]):
    firstStreak = 1
    i = 1
    while i < length and necklace[index + i] == bead or necklace[index + i] == "w" or bead == "w":
        if (bead == "w") and (necklace[index + i] != "w") :
            bead = necklace[index + i]
        i += 1
        firstStreak += 1
    secondStreak = 0
    while i < length and (necklace[index + i] != bead):
        i += 1
        secondStreak += 1
    maxes.append(firstStreak + secondStreak)
print(max(maxes))

相关问题 更多 >