学习来源:
9.13学习:
LCP 17 速算机器人
算法分析:朴素法、数学法。
数学法:不管进行A
操作还是B
操作,最后的X+Y
一定等于2*(X+Y)
。
return 2**(len(s)) #这里是2的len(s)次幂
LCP 18 早餐组合
分析顺序不涉及算法的优劣性
算法分析1:朴素算法容易超时,若不采用二分查找,则需要考虑简化双层遍历(双指针)。首先排序后的数组默认由小到大,因此从staple
中取出的元素值只会越来越大。那么相对应的,留给drinks
的目标值只会越来越小。因此指向drinks
的指针只需从尾部向头部移动,不需要每次都初始化为尾部。
staple.sort()
drinks.sort()
mod = 1000000007
r = len(drinks) - 1
res = 0
for i in range(len(staple)):
'''
若当前i=前一个i,则while的条件无法满足,直接更新res
若当前i>前一个i,则while条件有可能满足,若满足,则r继续向drinks头部移动
'''
while r >= 0 and drinks[r] + staple[i] > x:
r -= 1
res = (res + r + 1)
return res % mod
算法分析2:二分查找,遍历staples
,在drinks
中二分查找。
def binarysearch(a,x):
l = 0
r = len(a)
while l<r:
m = l + (r - l)//2
if a[m] > x:
r = m
else:
l = m + 1
return l
staple.sort()
drinks.sort()
mod = 1000000007
res = 0
for i in range(len(staple)):
t = x - staple[i]
ind = binarysearch(drinks, t)
if ind == 0:
break
res = (res + ind) % mod
return res
算法分析3:空间换时间,arr[i]
表示在staple
中,当有i
元时,可以选择的主食有多少种。
res = 0
mod = 1000000007
arr = [0 for _ in range(x+1)]
for i in staple:
if i < x:
arr[i] += 1
for i in range(2,x+1):
arr[i] += arr[i-1]
for i in drinks:
remian = x - i
if remian > 0:
res += arr[remian]
return res % mod