Travel around the world

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zjucor/article/details/82698030

在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)

猜你喜欢

转载自blog.csdn.net/zjucor/article/details/82698030
今日推荐