输入
第一行是输入偶数的个数,最小为2,最大可能到几万。之后每行为一个偶数,最小是4,最大可能是几百万,不重复的升序排列。
输出
输入数据两两间距离的总和,这应该是一个不小于0的整数。
一拿个这个问题,首先容易想到使用动态规划的方法来做,时间复杂度为
初步实现
import math
import numpy as np
def is_prime(n): #判断是否为素数
if not n%2:
return False
else:
for i in range(3,int(math.sqrt(n))+1,2):
if not n%i:
return False
return True
def distence(s,t): #计算两个偶数间素数的个数:
dist=0
for i in range(s+1,t,2):
if is_prime(i):
dist+=1
return dist
if __name__=='__main__':
len=int(input())
arr=np.zeros((len,len)) #存放任意两个数的距离
summer=0
for i in range(len):
after=int(input())
if i>=1:
arr[i,i-1]=distence(before,after)
for j in range(i-1):
for s in range(j,i):
arr[i,j]+=arr[s+1,s]
summer+=arr[i,:].sum()
before=after
print(int(summer))
进一步考虑:在计算距离总和过程中,相连两个数的距离被反复求和,于是可以用乘法运算代替多次加法运算,利用这个思想,时间复杂度可降为
再次实现
if __name__=='__main__':
len=int(input())
summer=0
for i in range(len):
after=int(input())
if i>=1:
summer+=distence(before,after)*i*(len-i)
before=after
print(summer)