Python 如何优化此代码以不受时间限制?(codeforce 344A磁铁)
''' 这是一个代码力问题(344A),我的代码给出了正确的输出,但在案例7中,它给出了这个问题 “测试:#7,时间:1000毫秒,内存:28808 KB,退出代码:0,检查程序退出代码:0,判定:超出时间限制”Python 如何优化此代码以不受时间限制?(codeforce 344A磁铁),python,python-3.x,time,Python,Python 3.x,Time,''' 这是一个代码力问题(344A),我的代码给出了正确的输出,但在案例7中,它给出了这个问题 “测试:#7,时间:1000毫秒,内存:28808 KB,退出代码:0,检查程序退出代码:0,判定:超出时间限制” 我不知道我的代码的哪一部分导致此错误错误是由您的代码变慢引起的 你真的不需要记住你读过的每一张瓷砖。您只需检查刚刚读取的磁贴是否与上一个磁贴不同 另外,从我的测试来看,pypy在这个问题上确实比python慢。在同一份提交文件中,我使用pypy 3.6在测试7中失败,使用Python3
我不知道我的代码的哪一部分导致此错误错误是由您的代码变慢引起的 你真的不需要记住你读过的每一张瓷砖。您只需检查刚刚读取的磁贴是否与上一个磁贴不同
另外,从我的测试来看,pypy在这个问题上确实比python慢。在同一份提交文件中,我使用pypy 3.6在测试7中失败,使用Python3.7在测试7中434ms成功(仅在
输入部分之后),我测量了您的解决方案,并获得了以下结果(以秒为单位):
我制作了一个更紧凑、更快的解决方案:
>>> 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)
我希望这足以通过这个问题(在我看来,我的解决方案也可以更快)
编辑:
以下解决方案通过Python 3.7.2解释器(372ms)传递强>
具有sum
和zip
内置功能的其他解决方案:
>>> python3 test.py
4
01
01
10
10
2
7.535385131835938e-05
使用len
和zip
:
_list = [input() for _ in range(int(input()))]
print(1 + sum(x != y for x, y in zip(_list, _list[1:])))
对于这个问题,代码可能比预期的慢。如果不需要第一个。你可以删除它,改为使用range(0,len(_list)-1)
@Aguy在测试7中,它在列表中添加了100000个项目,想知道如果按照上面的建议,只使用一个项目是否会使代码运行缓慢。但时间限制仍然超出了我又添加了两个解决方案。你可以试试。
_list = [input() for _ in range(int(input()))]
print(1 + sum(x != y for x, y in zip(_list, _list[1:])))
_list = [input() for _ in range(int(input()))]
print(1 + len([True for x, y in zip(_list, _list[1:]) if x != y]))