python - 我应该怎么做才能减少代码的运行时间?
问题描述
这是一个 URI 在线判断问题(问题编号:1973)。
在圣卡塔琳娜州西部地区购买了许多相邻的农场后,Star 家族修建了一条单一的道路,依次经过所有农场。该序列的第一个农场被命名为 Star 1,第二个农场被命名为 Star 2,依此类推。然而,住在一号星的哥哥气急败坏,决定制作星际迷航,以从兄弟姐妹的礼节中偷羊。但他绝对是疯了。当经过农场 Star i 时,他只从该农场偷走一只羊(如果有的话),然后移动到 Star i + 1 或 Star i - 1,这取决于 Star i 中的羊数量是否分别为, 奇数或偶数。如果没有他想去的星星,他就会停止他的跋涉。疯狂的兄弟在星际 1 中开始了他的星际迷航,从他自己的农场偷了一只羊。
输入
第一个输入行由一个整数 N (1 ≤ N ≤ 106) 组成,表示星星的数量。第二个输入行由 N 个整数组成,其中第 i 个整数 Xi (1 ≤ Xi ≤ 106) 表示 Star i 中的初始绵羊数量。
输出
输出一行,包含两个整数,第一个代表被狂哥攻击的星星数量,第二个代表未被偷走的羊的总数。
我已经解决了这个问题,也给出了想要的输出,但是每次我提交它都说超过了时间限制。
#1st solution:
num_star = int(input())
sheep = list(map(int, input().split()))
star = set()
index = 0
while index != num_star:
if sheep[index] == 0:
break
elif sheep[index] % 2 == 1:
star.add(index)
sheep[index] -= 1
index += 1
else:
star.add(index)
sheep[index] -= 1
index -= 1
if index == -1:
break
print(len(star), sum(sheep))
#2nd solution
n = int(input())
x = list(map(int, input().split()))
i = 0
farm_visited = 0
while i in range(n):
if x[i] == 0:
if i >= farm_visited: farm_visited = i+1
break
elif (x[i]) % 2 == 1:
if i >= farm_visited: farm_visited = i + 1
x[i] -= 1
i += 1
else:
if i >= farm_visited: farm_visited = i + 1
x[i] -= 1
i -= 1
print(farm_visited, sum(x))
解决方案
如果您想自己解决,请不要阅读下文。
def madstar(s): # s is the list
if all(e % 2 for e in s): # all Stars with odd numbers
return (len(s), sum(s)-len(s)) # just one sheep stolen from each Star
for i,e in enumerate(s):
if e % 2 == 0: # even number found
return (i+1, # Stars are numbered from 0, so i==0 -> 1 Star visited etc.
sum(s) - ( # stolen sheep
2*(i+1) # two for every visited Star
- s[:i].count(1) # except visited Stars with initially only 1 sheep
- (1 if e>0 else 2) # and the final one, where it is either 0 or 1, but never 2
))
for test_list in [[1,3,5,7,11,13,17,19],
[1,3,5,7,11,13,16,19],
[1],
[3,0,2],
[0],
[2]]:
print(test_list, '->', madstar(test_list))
推荐阅读
- verilog - 在 Verilog 上下文中遇到 SystemVerilog 功能“reg”?
- android - Camera2 控制连拍模式
- android - 安卓:如何通过通知操作向服务发送广播意图?
- javascript - Slack App(机器人)向多个用户发送私人消息
- reactjs - 使用片段时的密钥问题 - React
- haskell - 如何在 Haskell 中将返回类型多态性与参数多态性结合起来?
- notepad++ - 在同一行中的字符串结尾和下一个字符串之前缩进
- ember.js - 如何结合 ember-bootstrap 和 ember-autoresize?
- regex - Python 2.7 重新搜索和 findall 提供不同的搜索结果
- apache-spark - 使用 Databricks 提高 PySpark 或 Delta Table 中的连接和模糊处理性能