【问题标题】:How can i optimize this code to not get time limit?(codeforce 344A magnets)如何优化此代码以不受时间限制?(codeforces 344A 磁铁)
【发布时间】:2020-08-04 13:25:35
【问题描述】:
number_of_magnets=int(input())
_list=[]
for i in range(0,number_of_magnets):
x=input()
_list.append(x)

number_of_groups=1
for i in range(0,len(_list)):
  if i!=len(_list)-1:
    if _list[i]!=_list[i+1]:
       number_of_groups=number_of_groups+1


print(number_of_groups)

'''

这是一个 codeforce 问题(344A),我的代码给出了正确的输出,但在案例 7 中它给了我这个

“测试:#7,时间:1000 毫秒,内存:28808 KB,退出代码:0,检查器退出代码:0,判断:TIME_LIMIT_EXCEEDED”

我不知道我的代码的哪一部分导致了这种情况

【问题讨论】:

  • 也许这个问题的代码比预期的要慢。第一个if 不是必需的。您可以将其删除并改用range(0, len(_list)-1)
  • @Aguy 在测试 7 中,它在列表中添加了 100000 个项目,想知道它是否使代码变慢
  • 如果按照上面的建议尝试一个。

标签: python python-3.x time


【解决方案1】:

这个错误是因为你的代码太慢了。

你并不需要记住你读过的每一个图块。您只需检查您刚刚读取的磁贴是否与上一个磁贴不同。

另外,根据我的测试,pypy 在这个问题上确实比 python 慢。使用相同的提交,我在使用 pypy 3.6 的测试 7 中失败,在使用 python 3.7 的测试 7 中以 434 毫秒成功

【讨论】:

    【解决方案2】:

    我已经测量了您的解决方案(仅在 input 部分之后),我得到了以下结果(以秒为单位):

    >>> python3 test.py 
    4
    01
    01
    10
    10
    2
    0.00010013580322265625
    

    我已经做了一个更紧凑和更快的解决方案:

    _list = [input() for _ in range(int(input()))]
    print(len([i for i in range(len(_list) - 1) if _list[i] != _list[i + 1]]) + 1)
    

    我的结果:

    >>> python3 test.py 
    4
    01
    01
    10
    10
    2
    7.535385131835938e-05
    

    我希望通过这个问题就足够了(我认为我的解决方案也可以更快)。

    编辑:

    以下解决方案通过 Python 3.7.2 解释器(372ms)!

    具有sumzip 内置函数的其他解决方案:

    _list = [input() for _ in range(int(input()))]
    print(1 + sum(x != y for x, y in zip(_list, _list[1:])))
    

    使用lenzip

    _list = [input() for _ in range(int(input()))]
    print(1 + len([True for x, y in zip(_list, _list[1:]) if x != y]))
    

    【讨论】:

    • 仍然超过时限
    • 我又添加了两个解决方案。你可以试试。
    猜你喜欢
    • 2022-01-25
    • 2021-08-09
    • 1970-01-01
    • 2019-12-14
    • 2011-04-09
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多