py刷题|豆包MarsCode AI刷题

98 阅读6分钟

解题sop

  1. 题目分析

  2. 代码分析

  3. 优化技巧

  4. 复杂度分析

    1. 时间复杂度

    2. 空间复杂度

题目-题解

卡牌对弈游戏策略

小C最近在玩一种卡牌对弈游戏,双方各持有相同数量的卡牌,每张卡牌都有一个特定的武力值。双方每轮各出一张卡牌,若己方卡牌的武力值大于对方,则该轮取胜。小C具备读心术,能够预知对方的出牌顺序,但需要你帮他设计一个最优策略,来尽可能赢得最多的对弈局数。

每轮对弈中双方各出一张卡牌,游戏结束时需要使用完所有卡牌。你需要输出小C最多能赢得的对弈局数。

例如,当双方手中卡牌的武力值分别为[1, 2, 3][1, 2, 3]时,小C可以最多赢得2局。


测试样例

样例1:

输入:n = 3, x = [1, 2, 3], y = [1, 2, 3] 输出:2

样例2:

输入:n = 3, x = [1, 3, 2], y = [5, 5, 5] 输出:3

样例3:

输入:n = 4, x = [2, 4, 6, 8], y = [3, 3, 7, 9] 输出:3

调试过程

题目分析:

想要胜利,必须要尽可能保证小c的牌是始终大于对方的

先对c的牌和对手的牌进行排序

然后从大到小遍历c的牌去和从大到小对方的牌比较,一旦大于则加一分

看输入输出知道y应该才是小c的牌,不能先入为主以为y就是对手

第一轮豆包写的代码(错的奥别直接复制

中间应该是嵌套循环而不应该是同步遍历比较

还是有问题,看输出应该是重复对2这个数进行了比较

所以要保证:

判断小C当前卡牌是否大于对手当前卡牌,如果是,则小C赢得该局。

同时删除x中的这张牌,防止出现重复比较(这回对了

最终代码:

def solution(n: int, x: list, y: list) -> int:
    # 1. 对两个列表进行排序
    x.sort(reverse=True)  # 对手的牌从大到小排序
    y.sort(reverse=True)  # 小C的牌从大到小排序
    
    win_count = 0
    used_indices = set()  # 用于标记已经使用过的对手的牌的索引
    
    # 2. 使用嵌套循环进行比较
    for i in range(n):
        for j in range(n):
            if j not in used_indices and y[j] > x[i]:
                # 小C赢得该局,标记对手的牌已经使用过
                win_count += 1
                used_indices.add(j)
                break
    
    # 3. 返回小C赢得的局数
    return win_count

if __name__ == '__main__':
    print(solution(n=3, x=[1, 2, 3], y=[1, 2, 3]) == 2)
    print(solution(n=3, x=[1, 3, 2], y=[5, 5, 5]) == 3)
    print(solution(n=4, x=[2, 4, 6, 8], y=[3, 3, 7, 9]) == 3)

总结分析

难点:

对题目实现逻辑的理解。

那怎么保证下次我能直接想到说

先进行循环嵌套比较,然后删除对手被比下去数

遗留问题

这是一个什么样的解题思路,可以进行归类吗

小R的雪球滚落计算(内存效率优化)

问题描述

在一座高度为 H 的山上,每个高度 i 处生成了 a_i 个雪球。当雪球从海拔高度 i 滚到地面时,它的体积会膨胀 x^i 倍。也就是说,雪球的初始体积为 1,滚动距离 i 会使体积变成 1 * x^i。我们需要计算所有滚落到地面的雪球的总体积,并对结果取模 10^9 + 7

你的任务是帮助计算所有雪球滚落到地面的总体积。


测试样例

样例1:

输入:H = 4, x = 5, a = [1, 3, 2, 4] 输出:2830

样例2:

输入:H = 2, x = 5, a = [1, 2] 输出:55

样例3:

输入:H = 3, x = 3, a = [2, 1, 1] 输出:42

解题过程

肯定要遍历所有的雪球

H高度是最外层

里层是a数组

这个豆包额,我想要的是答案,不是提示,我又不会基础的py语法

GPT这也不对啊,他怎么每一步都取模一下,输出的结果有点小(不对,都取模和加完取模应该是一样的

改完还是不对,看来要求助一下人工了

juejin.cn/post/743936…

找到解决方案了

原因是,即使是分开取模,也是超出内存的,所以一开始的幂运算就要用优化算法

要是用快速幂的方式取log

最终代码

def power_mod(base, exp, mod):
    result = 1
    while exp > 0:
        if exp % 2 == 1:  # 如果 exp 是奇数
            result = result * base % mod
        base = base * base % mod
        exp //= 2  # 相当于 exp = exp // 2
    return result

def solution(H, x, a):
    MOD = 10**9 + 7
    total_volume = 0
    for i in range(H):
        # 使用快速幂计算 x^i % MOD
        volume = power_mod(x, i + 1, MOD)
        total_volume += a[i] * volume % MOD
        total_volume %= MOD
    return total_volume

题目总结:

优化效率,在内存上,要优化超出内存的过程,而不是优化处理超出内存的数据

题目一开始就在引导错误的方向:对结果取模,但这个结果本身就没办法存在

巧克力板选择问题

问题描述

小M在春游时打算携带尽可能多的巧克力板。她拥有n块巧克力板,每块巧克力的边长为aiai,重量为ai2ai2。小M有多个不同大小的背包,每个背包都有一定的最大承重限制。她希望你帮助她计算在每个背包的最大承重范围内,最多可以带走多少块巧克力板。

例如:小M有5块巧克力板,边长分别为1, 2, 2, 4, 5,有5个不同的背包,其最大承重分别为1, 3, 7, 9, 15。对于每个背包,她能装入的巧克力块数分别是1, 1, 2, 3, 3


测试样例

样例1:

输入:n = 5, m = 5, a = [1, 2, 2, 4, 5], queries = [1, 3, 7, 9, 15] 输出:[1, 1, 2, 3, 3]

样例2:

输入:n = 4, m = 3, a = [3, 1, 2, 5], queries = [5, 10, 20] 输出:[2, 2, 3]

样例3:

输入:n = 6, m = 4, a = [1, 3, 2, 2, 4, 6], queries = [8, 12, 18, 25] 输出:[2, 3, 4, 4]

解题过程

目标是带走尽可能多的巧克力

只对重量有要求

先计算重量

在排序

再放背包里,放得下就+1放不下就不变,重新开始对下一个背包开始遍历巧克力

最终代码(豆包直接对了)

def solution(n: int, m: int, a: list, queries: list) -> list:
    # 计算每块巧克力板的重量
    weights = [x**2 for x in a]
    
    # 对巧克力板按重量从小到大排序
    sorted_weights = sorted(weights)
    
    result = []
    for max_weight in queries:
        # 初始化当前背包的装载量
        current_weight = 0
        count = 0
        
        # 从最轻的巧克力板开始装
        for weight in sorted_weights:
            if current_weight + weight <= max_weight:
                # 如果可以装下当前巧克力板,则装入
                current_weight += weight
                count += 1
            else:
                # 如果装不下,则跳出循环
                break
        
        # 记录当前背包的最大装载量
        result.append(count)
    
    return result

if __name__ == '__main__':
    print(solution(5, 5, [1, 2, 2, 4, 5], [1, 3, 7, 9, 15]) == [1, 1, 2, 3, 3])
    print(solution(4, 3, [3, 1, 2, 5], [5, 10, 20]) == [2, 2, 3])
    print(solution(6, 4, [1, 3, 2, 2, 4, 6], [8, 12, 18, 25]) == [2, 3, 4, 4])