题目描述
牛牛发明了一款破冰行动的游戏,假设在河面上,有n
块紧密相连的冰块。标号1-n
。将一只企鹅放到任意一个标号为k
的冰块上,现在通过打破一些冰块来使得企鹅掉落河中,然而他无法打破企鹅所踩的冰块k
。每个冰块都有不同的强度Ai
,所以需要一个等于Ai
的力来打破冰。当两侧的冰块都没有与河两岸连接时,则冰块会掉落到河中。
输入描述
第一行给出n
,表示冰块的数量。
第二行中,按顺序给出代表打破第i
块冰块所需的力的Ai
。题目保证企鹅所在的地方用-1
表示,没有企鹅位于冰块1
或冰块n
的情况。
3<=n<=2*10^5
输出描述
输出可以击落企鹅到水中的最小力。
package main
import (
"fmt"
"math"
)
func minForceToSinkPenguin(n int, strengths []int) int {
// 初始化 left 和 right 数组
left := make([]int, n)
right := make([]int, n)
// 计算 left 数组
left[0] = strengths[0]
for i := 1; i < n; i++ {
if strengths[i] == -1 {
left[i] = math.MaxInt32
} else {
left[i] = left[i-1] + strengths[i]
}
}
// 计算 right 数组
right[n-1] = strengths[n-1]
for i := n - 2; i >= 0; i-- {
if strengths[i] == -1 {
right[i] = math.MaxInt32
} else {
right[i] = right[i+1] + strengths[i]
}
}
// 找到企鹅的位置
k := -1
for i := 0; i < n; i++ {
if strengths[i] == -1 {
k = i
break
}
}
// 计算最小力
if k == -1 {
return -1 // 如果没有找到企鹅的位置,返回 -1
}
minForce := math.MaxInt32
if k > 0 && k < n-1 {
minForce = left[k-1] + right[k+1]
}
return minForce
}
func main() {
var n int
fmt.Scan(&n)
strengths := make([]int, n)
for i := 0; i < n; i++ {
fmt.Scan(&strengths[i])
}
result := minForceToSinkPenguin(n, strengths)
fmt.Println(result)
}