2024-11-03:得到更多分数的最少关卡数目。用go语言,Alice 和 Bob 正在进行一个有 n 个关卡的游戏,其中每个

举报
福大大架构师每日一题 发表于 2024/11/03 19:23:52 2024/11/03
【摘要】 2024-11-03:得到更多分数的最少关卡数目。用go语言,Alice 和 Bob 正在进行一个有 n 个关卡的游戏,其中每个关卡要么是困难模式(possible[i] == 0),要么是简单模式(possible[i] == 1)。玩家在游戏中获得分数的规则如下:通过简单模式的关卡可得 1 分,而遇到困难模式的关卡将扣除 1 分。Alice 从第 0 关开始逐关完成,而 Bob 则完成剩...

2024-11-03:得到更多分数的最少关卡数目。用go语言,Alice 和 Bob 正在进行一个有 n 个关卡的游戏,其中每个关卡要么是困难模式(possible[i] == 0),要么是简单模式(possible[i] == 1)。玩家在游戏中获得分数的规则如下:通过简单模式的关卡可得 1 分,而遇到困难模式的关卡将扣除 1 分。

Alice 从第 0 关开始逐关完成,而 Bob 则完成剩下的关卡。两位玩家都会采取最优策略,以争取获得更多的分数。Alice 希望知道她至少需要完成多少个关卡,才能确保自己的得分超过 Bob。如果有这样的可能性,她希望得到一个具体的最小关卡数,如果不可能,那么返回 -1。

输入:possible = [1,0,1,0]。

输出:1。

解释:

我们来看一下 Alice 可以完成的关卡数目:

如果 Alice 只完成关卡 0 ,Bob 完成剩下的所有关卡,那么 Alice 获得 1 分,Bob 获得 -1 + 1 - 1 = -1 分。

如果 Alice 完成到关卡 1 ,Bob 完成剩下的所有关卡,那么 Alice 获得 1 - 1 = 0 分,Bob 获得 1 - 1 = 0 分。

如果 Alice 完成到关卡 2 ,Bob 完成剩下的所有关卡,那么 Alice 获得 1 - 1 + 1 = 1 分,Bob 获得 -1 分。

Alice 需要完成至少一个关卡获得更多的分数。

答案2024-11-03:

chatgpt

题目来自leetcode3096。

大体步骤如下:

1.计算总得分:

  • 首先,遍历整个 possible 数组,计算所有简单模式关卡的数量,这个数量可以视为总得分的一部分。

  • 设定变量 tot 用来保存计算出的总得分。在计算过程中,简单模式的关卡 (+1) 会增加得分,而困难模式的关卡 (-1) 则会减少得分。

  • 公式为: tot = (简单模式关卡数 * 2) - n,其中 n 为关卡总数。

2.评估 Alice 的得分与 Bob 的得分:

  • 初始化一个 pre 变量,用于记录 Alice 目前的得分。

  • 遍历关卡,逐一判断 Alice 完成的关卡数:

    • 如果当前关卡是简单模式 (possible[i] == 1),则 pre 增加 1。

    • 如果当前关卡是困难模式 (possible[i] == 0),则 pre 减少 1。

  • 在每一次更新 pre 后,检查 2 * pre 是否大于 tot

    • 如果是,说明此时 Alice 的得分已经超过了 Bob 的得分,返回 Alice 已完成的关卡数 i + 1

    • 如果遍历结束后仍未找到满足条件的关卡,则返回 -1。

3.打印结果:

  • main 函数中调用上述函数并输出结果。

输出示例分析

给定输入 possible = [1, 0, 1, 0] 的情况下:

  • 当 Alice 只完成第 0 关时,得分为 +1,Bob 得分为 -1,Alice 胜出。

  • 当 Alice 完成第 1 关时,得分为 0,Bob 得分为 0,平局。

  • 当 Alice 完成第 2 关时,Alice 的得分为 1,Bob 的得分为 -1,Alice 胜出。

根据以上分析,Alice 需要完成 至少一个 关卡才能确保得分超过 Bob,因此结果是 1。

复杂度分析

  • 时间复杂度:

    • 遍历 possible 数组的时间复杂度为 O(n),因为我们需要计算 tot 和更新 pre

    • 整体时间复杂度为 O(n)。

  • 空间复杂度:

    • 此算法只使用了常数级别的额外空间,主要是用于存储 totpre 变量。

    • 因此,空间复杂度为 O(1)。

综上所述,这个算法在处理效率和资源占用方面都是比较优的。

Go完整代码如下:

package main

import (
	"fmt"
)

func minimumLevels(possible []int) int {
	n := len(possible)
	tot := 0
	for _, v := range possible {
		tot += v
	}
	tot = tot*2 - n
	pre := 0
	for i := 0; i < n-1; i++ {
		if possible[i] == 1 {
			pre++
		} else {
			pre--
		}
		if 2*pre > tot {
			return i + 1
		}
	}
	return -1
}

func main() {
	possible := []int{1, 0, 1, 0}
	fmt.Println(minimumLevels(possible))
}

在这里插入图片描述

Rust完整代码如下:


fn minimum_levels(possible: Vec<i32>) -> i32 {
    let n = possible.len() as i32;
    let mut total = 0;

    for &v in &possible {
        total += v;
    }
    
    total = total * 2 - n;

    let mut pre = 0;
    for i in 0..(n - 1) {
        if possible[i as usize] == 1 {
            pre += 1;
        } else {
            pre -= 1;
        }

        if 2 * pre > total {
            return i + 1;
        }
    }
    -1
}

fn main() {
    let possible = vec![1, 0, 1, 0];
    println!("{}", minimum_levels(possible));
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。