前缀和+枚举(10%的案例超时)
n = int(input())
gems = [0] + [int(input()) for _ in range(n)]
v = int(input())
s = [0]*(n+1)
for i in range(1,n+1):
s[i] = s[i-1] + gems[i]
ans = 0
for i in range(0,n+1):
for j in range(i+1,n+1):
curSum = s[j] - s[i]
if curSum <= v:
ans = max(ans,j-i)
print(ans)
双指针
n = int(input())
gems = [int(input()) for _ in range(n)]
v = int(input())
def getResult():
# 记录题解
ans = 0
# 双指针
l = r = 0
# 双指针范围内的和
window_sum = 0
while r < n:
#加入r指针指向的元素
window_sum += gems[r]
if window_sum <= v:
# 如果总和不超过拥有的钱,则继续加入后门的
r += 1
else:
# 如果总和超过了拥有的钱,则[l, r-1]范围的宝石是能够买下的,记录此时的宝石数列 r-1-l+1
ans = max(ans,r-l)
flag = False
while l < r:
# 由于纳入r位置宝石后,总和超过了拥有的钱,因此尝试丢弃l指针宝石,即l++
window_sum -= gems[l]
l += 1
if window_sum <= v:
# 如果丢弃l宝石后,总和不超过拥有的钱,则继续纳入r后面的宝石
r += 1
flag = True
break
if flag:
continue
# 如果把 l~r-1 范围内的宝石都丢弃了,总和仍然超过拥有的钱,那么就r宝石的价值超过了手中的钱
# 此时双指针范围内不能包含r位置,可以将l,r 全部移动到r+1位置
r += 1
l = r
window_sum = 0
# 收尾操作
if window_sum <= v:
ans = max(ans,r-l)
return ans
print(getResult())