【问题标题】:Optimize the code to run in less than 5 second优化代码运行时间小于 5 秒
【发布时间】:2017-10-18 09:22:51
【问题描述】:

在 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 个以空格分隔的非负数——即阿尼鲁达在第 i 天将行走的距离。保证这些数字中至少有一个大于零。

第三行是阿尼鲁达必须达到的里程碑价值。

输出

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

约束

1<=T<= 10

1<=N<=10^5

0<=X<=10^8

0<=M<=10^16

【问题讨论】:

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


【解决方案1】:

感谢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 秒的时间内运行!

【讨论】:

    【解决方案2】:

    假设这个问题来自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
    

    【讨论】:

    • 我猜你忘记了余数为0的情况?
    • 你不能简单地返回 dist 的长度。说dist = [5, 6, 0, 0, 0],如果余数为 0,那么答案将是第 2 天而不是第 5 天!可能最好的方法是为dist_per_year 运行一次循环!在下面检查我的答案!
    猜你喜欢
    • 2016-10-04
    • 2014-07-17
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多