【LeetCode】每日一题 2024_2_2 石子游戏 VI(排序、贪心)

文章目录

LeetCode?启动!!!

题目:石子游戏 VI

题目链接:1686. 石子游戏 VI

题目描述

代码与解题思路

go 复制代码
func stoneGameVI(aliceValues []int, bobValues []int) int {
    type pair struct { x, y int }
    pairs := make([]pair, len(aliceValues))
    
    // 把 Alice 和 Bob 的石子计分保存下来
    for i := 0; i < len(aliceValues); i++ {
        pairs[i] = pair{aliceValues[i], bobValues[i]}
    }

    // 根据我们分析的性质进行排序
    slices.SortFunc(pairs, func(p, q pair) int { 
        return (q.x + q.y) - (p.x + p.y) 
    })

    // 根据最优解计算 Alice 和 Bob 的得分
    a, b := 0, 0
    for i, v := range pairs {
        if i % 2 == 0 {
            a += v.x
        } else {
            b += v.y
        }
    }

    // 比较最后谁赢了
    if a > b {
        return 1
    } else if a < b {
        return -1
    }
    return 0
}

题目中 Alice 和 Bob 玩石子游戏,游戏的规则是:有一堆石子,每次可以拿石子堆中任意一个石子,拿过的石子不能再被拿

而 Alice 和 Bob 的计分方式是不同的,Alice 先手,如果要最优解,那 Alice 每次必须拿给自己和 Bob 加分最多的石子(这样自己加分多,Bob 少了这个石子加分就少了),也就是她拿的石子的 aliceValues[i] + bobValues[i] 越大越好

而 Bob 也是同样的,拿给自己和 Alice 加分最多的石子就行,也就是说,我们只需要按照这个规则升序排序 aliceValues[i] + bobValues[i],然后就能通过最优解求出他们最后到底谁会赢了

这次还学习了 go 语言 slices 包的自己指定规则排序数组:

slices.SortFunc(pairs, func(p, q pair) int {

return (q.x + q.y) - (p.x + p.y)

})

用:后一个数 - 前一个数 = 升序排序

这里的排序规则就是我们前面提到的 aliceValues[i] + bobValues[i],通过 pairs 数组保存住 Alice 和 Bob 每个石子的价值,遍历的时候计算,最后再比较他们的大小即可

相关推荐
草履虫建模19 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
naruto_lnq21 小时前
分布式系统安全通信
开发语言·c++·算法
Jasmine_llq21 小时前
《P3157 [CQOI2011] 动态逆序对》
算法·cdq 分治·动态问题静态化+双向偏序统计·树状数组(高效统计元素大小关系·排序算法(预处理偏序和时间戳)·前缀和(合并单个贡献为总逆序对·动态问题静态化
爱吃rabbit的mq1 天前
第09章:随机森林:集成学习的威力
算法·随机森林·集成学习
(❁´◡`❁)Jimmy(❁´◡`❁)1 天前
Exgcd 学习笔记
笔记·学习·算法
YYuCChi1 天前
代码随想录算法训练营第三十七天 | 52.携带研究材料(卡码网)、518.零钱兑换||、377.组合总和IV、57.爬楼梯(卡码网)
算法·动态规划
不能隔夜的咖喱1 天前
牛客网刷题(2)
java·开发语言·算法
VT.馒头1 天前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
进击的小头1 天前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
yunteng5211 天前
游戏全球服_基础信息
游戏·全球同服