题意

环形的公路,a[i]表示从第i个站点到第i+1个站点的距离,a[n]表示第n个站点到第1个站点的距离,求第x个站点到第y个站点的最短距离。

思路

这里先假设x小于y,如果不满足的话就交换x和y

有两种路径可以从x到y,一是从x直接走到y,二是从y经过n走到x。

用前缀和可以快速求出两个站点之间的距离,这种环形问题一般是加一倍变成直线来处理。

从x直接走到y的结果是sum[y-1] - sum[x-1] ,这里用sum[y-1]的原因是因为a[i]表示的是第i个站点到第i+1个站点的距离,所以同理推到前缀和的话,也是从y-1个站点到第y个站点的前缀和,我们最后要到达的是第y个站点,所以用y-1

同理如果是从y经过n再走到x的话,实际上在直线上相当于从y走到x+n,结果是sum[x+n-1] - sum[y-1]

两者取min

Go代码

package main

import "fmt"

func min(a,b int) int {
	if a < b {
		return a 
	}
	return b 
}

func main() {
	var n, x, y int
	fmt.Scan(&n)
	a := make([]int, n*2+1)
	for i := 1; i <= n; i++ {
		fmt.Scan(&a[i])
		a[n+i] = a[i]
	}
    fmt.Scan(&x,&y)
	sum := make([]int, 2*n+1)
	for i := 1; i <= 2*n; i++ {
		sum[i] = sum[i-1] + a[i]
	}
	fmt.Scan(&x, &y)
    if x > y {
        x,y = y,x 
    }
	fmt.Print(min(sum[y-1] - sum[x-1],sum[x+n-1] - sum[y-1]))
}