题意
环形的公路,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])) }