python - 优化问题中蛮力数的算法
问题描述
有多少对(i, j)
存在这样1 <= i <= j <= n
, j - i <= a
?
'n'
并'a'
输入数字。
问题是我的算法在增加“n”或“a”时太慢了。
我想不出一个正确的算法。
执行时间必须小于 10 秒。
测试:
n = 3
a = 1
对数 = 5n = 5
a = 4
对数 = 15n = 10
a = 5
对数 = 45n = 100
a = 0
对数 = 100n = 1000000
a = 333333
对数 = 277778388889n = 100000
a = 555555
对数 = 5000050000n = 1000000
a = 1000000
对数 = 500000500000n = 998999
a = 400000
对数 = 319600398999n = 898982
a = 40000
对数 = 35160158982
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)
解决方案
您正在使用二次算法,但您应该能够将其变为线性(甚至可能更好)。
主要问题是确定有多少对,给定i
和j
。将其拆分为一个函数是很自然的。
一个关键点是,对于i
固定的,j
与之相配i
的在 到 的范围i
内min(n,i+a)
。这是因为j-i <= a
等价于j <= i+a
。
对于min(n,i+a) - i + 1
给j
定的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
在大约一秒钟内评估为。如果这仍然很慢,请进行更多的数学分析。
推荐阅读
- html - 在网页中找到文本并单击 - Eclipse Selenium
- selenium - ChromeDriver - 无法登录谷歌帐户
- c++ - std::divides 上的 C++ 等号运算符
- php - 停止 PHP_EOL 将数据附加到上一行
- kubernetes - 如何在 Polyaxon 中使用 TPU Pod
- react-native - 使用 React Native 在 LinearGradient 视图中放置输入包,结果与 IOS 中的以下内容重叠
- primefaces - 如果行不可见,自动取消选中 ap:datatable 中的行
- python - 复制 BigQuery UDF
- ios - 如果未拖动 collectionView,则 UICollectionViewFlowLayout Self-Sizing 单元格未对齐
- object - 如何向作为对象属性的数组添加值?