在Steven的世界里,有通过N条单向道路连接的N个城市。程序标号分别为 0 到 N - 1。Steven可以从 城市 i 走到 城市 (i + 1) % N,( 0-> 1 -> 2 -> .... -> N - 1 -> 0).
Steven 想开汽车巡游世界。他的车子的油箱容积为 C 升。在每一座城市他可以最多加 a[i] 升油,并且从 城市 i 到下一个城市油耗为 b[i] 升。
Steven 希望可以从一个城市出发然后游玩所有的城市回到出发的城市。他有多少个城市能够作为出发点?
注意
油箱初始为空。
输入格式
第一行包含两个整数:城市个数 N 和 油箱容积 C
第二行包含 N 个整数: a[0] a[1] … a[N - 1] 第三行包含 N 个整数: b[0] b[1] … b[N - 1]
输出格式
能够作为出发城市的个数。
数据范围
2 ≤ N ≤ 105
1 ≤ C ≤ 1018
1 ≤ a[i], b[i] ≤ 109
样例输入
3 3
3 1 2
2 2 2
样例输出
2
样例解析
Steven 如果从城市 0 出发:
在城市0,先加3升油,然后用2升油到达城市1. 油箱还剩1升油。
在城市1,先加1升油,然后用2升油到达城市2. 油箱还剩0升油。
在城市2,先加2升油,然后用2升油到达城市0. 油箱还剩0升油。
Steven 如果从城市 2 出发:
在城市2,先加2升油,然后用2升油到达城市0. 油箱还剩0升油。
在城市0,先加3升油,然后用2升油到达城市1. 油箱还剩1升油。
在城市1,先加1升油,然后用2升油到达城市2. 油箱还剩0升油。
所以答案是 2.
思路:先找到一个合法的起始位置,然后DP,当前合法的位置dp值为0(到达该位置不需要额外的起始油,就可以走完全程),然后从这个位置往前遍历求解DP数组,有2个trick
1. 把数组拓宽成2倍长度
2. 找合法的起始位置,因为有容量限制,所以遍历一次单倍长度的数组是不正确的,可以遍历拓宽后的数组,如果合理,在0-n位置就该出现合理的起始位置
https://www.hackerrank.com/challenges/travel-around-the-world/problem
https://www.hackerrank.com/challenges/travel-around-the-world/editorial
def travelAroundTheWorld(a, b, c):
a,b=a+a,b+b
d=[t1-t2 for t1,t2 in zip(a,b)]
valid=s=0
for i in range(len(d)):
s=min(c,s+a[i])-b[i]
if s<0: valid,s=i+1,0
# print(valid)
if valid>=len(a)//2: return 0
dp=[float('inf')]*len(a)
dp[valid+n]=0
for i in range(valid+n-1,valid,-1):
dp[i]=max(0, dp[i+1]-d[i])
return len([t for t in dp if t==0])
if __name__ == '__main__':
nc = input().split()
n = int(nc[0])
c = int(nc[1])
a = list(map(int, input().rstrip().split()))
b = list(map(int, input().rstrip().split()))
result = travelAroundTheWorld(a, b, c)
print(result)