15天大厂真题带刷 - ZT22 小美走公路 | Go
小美走公路
https://www.nowcoder.com/practice/23a0696faab049c2b5beb480db684487
题意
环形的公路,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]))
}
#牛客创作赏金赛#15天大厂真题带刷Go题解 文章被收录于专栏
15天大厂真题带刷Golang题解
深信服公司福利 752人发布