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

京公网安备 11010502036488号