优化代码以在不到5秒的时间内运行

时间:2017-05-18 13:58:48

标签: python-3.x optimization mathematical-optimization

在HackerEarth的一些测试用例中,代码占用时间超过5秒(5.001)。如何在不到5秒的时间内更好地优化此代码?

tc = int(input())
ip = []
for x in range(0, tc):
    temp = []
    temp.append(int(input()))
    temp.append([int(n) for n in input().split()])
    temp.append(int(input()))
    ip.append(temp)

for it in ip:
    while not it[2] <= 0:
        for x in range(0, it[0]):
            if it[1][x] == '0':
                continue
            it[2] -= int(it[1][x])
            if it[2] <= 0:
                it.append(x+1)
                break
    print(it[3])

仅供参考:

问题陈述

Aniruddha在距离方面达到里程碑M。他生活在一个不同的银河系中,一年中有N天。在第i天,他可以走近X距离。假设他走得最好,你需要输出他将达到里程碑的最小天数。

输入

第一个输入行包含T个测试用例。每个测试用例由三行组成。第一行由单个整数N组成 - 一年中的天数。

下一行包含N个非负空格分隔数字 - 即Aniruddha将在第一天行走的距离。保证这些数字中至少有一个大于零。

第三行包括Aniruddha必须达到的里程碑价值。

输出

对于每个测试用例,您需要输出以下查询的答案。

约束

1<=T<= 10

1<=N<=10^5

0<=X<=10^8

0<=M<=10^16

2 个答案:

答案 0 :(得分:0)

假设这个问题来自here,目标是找到一年中的哪一天达到里程碑。因此,我们只对去达到里程碑所需的去年感兴趣。

因此,通过使用%运算符简单地找出去年剩余的距离,可以生成代码的主要速度增加:

remainder = target % dist_per_year

然后可以使用与最初使用的方法相同的方法迭代余数。示例(用Python 2.7编写):

import random as rand
import time


def testcase(dist, milestone):
    dist_per_year = sum(dict)
    remainder = milestone % dist_per_year

    if remainder == 0:
        return len(dist)

    day = 0
    while remainder > 0:
        day = day + 1
        remainder = remainder - dist[day - 1]

    return day


milestone = rand.randint(0, 10e16)
days = rand.randint(1, 10e5)
dist = [rand.randint(0, 10e8) for i in xrange(days)]

t0 = time.time()
day = testcase(dist, milestone)
print 'Day:', day
print 'Time:', time.time() - t0

答案 1 :(得分:0)

感谢 J。 Hollom ,我做了一些更改并将代码移植到 Python 3.x 中。请注意我的代码是为Hacker Earth设计的(由J. Hollom提供的链接)因此它需要输入!

test_cases = int(input())
inputs = []
for x in range(test_cases):
    temp = []
    temp.append(int(input()))
    temp.append([int(n) for n in input().split()])
    temp.append(int(input()))
    temp.append(sum(temp[1]))
    inputs.append(temp)


for item in inputs:
    item[2] = item[2] % item[3]
    if item[2] == 0:
        item[2] += item[3]
    day = 0
    while item[2] > 0:
        item[2] -= item[1][day]
        day += 1 # Since day begins at Day 1 this will give right answer!
    print(day)

好吧,现在所有输入都在不到1秒的时间内完成!