每日算法题-将企鹅击落水中最小的力

题目描述

牛牛发明了一款破冰行动的游戏,假设在河面上,有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)
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值