首页 > 解决方案 > 优化问题中蛮力数的算法

问题描述

有多少对(i, j)存在这样1 <= i <= j <= n, j - i <= a'n''a'输入数字。

问题是我的算法在增加“n”或“a”时太慢了。
我想不出一个正确的算法。
执行时间必须小于 10 秒。

测试:


n, a = input().split()

i = 1
j = 1

answer = 0

while True:
    if n >= j:
        if a >= (j-i):
            answer += 1

            j += 1

        else:
            i += 1
            j = i

            if j > n:
                break

    else:
        i += 1
        j = i

        if j > n:
            break

print(answer)

标签: pythonalgorithm

解决方案


您正在使用二次算法,但您应该能够将其变为线性(甚至可能更好)。

主要问题是确定有多少对,给定ij。将其拆分为一个函数是很自然的。

一个关键点是,对于i固定的,j与之相配i的在 到 的范围imin(n,i+a)。这是因为j-i <= a等价于j <= i+a

对于min(n,i+a) - i + 1j定的i. 这将导致:

def count_pairs(n,a):
    return sum(min(n,i+a) - i + 1 for i in range(1,n+1))

count_pairs(898982,40000)35160158982在大约一秒钟内评估为。如果这仍然很慢,请进行更多的数学分析。


推荐阅读