刷题小记2 | 豆包MarsCode AI刷题

213 阅读5分钟

小E的怪物挑战

问题描述

小E在一个游戏中遇到了n个怪物。每个怪物都有其特定的血量h_i和攻击力a_i。小E的初始血量为H,攻击力为A。她可以击败那些血量和攻击力都小于她自身的怪物。每击败一个怪物后,小E的血量和攻击力会变为该怪物的血量的攻击力。小E想知道,他最多能击败多少怪物。

测试样例

样例1:

输入:n = 3, H = 4, A = 5, h = [1,2,3], a = [3,2,1] 输出为:1

样例2:

输入:n = 5, H = 10, A = 10, h = [6,9,12,4,7], a = [8,9,10,2,5] 输出为:2

样例3:

输入:n = 4, H = 20, A = 25, h = [10,15,18,22], a = [12,18,20,26] 输出为:3

思路

并不是太理解这道题的意思。可能有两个思路:

如果是像地牢一样,只能一层一层的往下打,那么就只能按顺序遍历来实现。

如果是可以随便选先打哪个怪物,那就可以按照一定的条件选择目前最优的怪物,以尽可能地多打怪物。

如果是按照第一种思路,那么样例3就应该只能打过一只怪物,与样例输出不符。

如果是按照第二种思路,那么样例2就应该可以打过三只怪物,与样例输出不符。打怪顺序[[9,9],[8,6],[4,2]]或者[[9,9],[7,5],[4,2]]

因此无论按照哪种思路,都没法满足样例。因此记录一下,希望哪个大佬看到了能解答一下

实现

这里对两种思路进行了实现

1 可以随便选

递归的方式实现

def solution(n: int, H: int, A: int, h: list, a: list) -> int:
    # write code here
    def findGoal(n: int, H: int, A: int, h: list, a: list, count: int):
        idx = -1
        maxSum = -1

        for i in range(n):
            if h[i] + a[i] > maxSum and h[i] < H and a[i] < A:
                maxSum = h[i] + a[i]
                idx = i
        if maxSum != -1:
            count += 1
            H = h[idx] 
            A = a[idx]
            h.pop(idx)
            a.pop(idx)
            return findGoal(n-1, H, A, h, a, count)
        else:
            return count
    res = findGoal(n, H, A, h, a, 0)
    print(res)
    return res

先对怪物进行排序,然后再依次判断

def solution(n: int, H: int, A: int, h: list, a: list) -> int:
    arr = []
    for i in range(n):
        arr.append([h[i],a[i]])
    sorted_arr = sorted(arr, key=lambda x: (x[0], x[1]), reverse=True)
    count = 0
    for i in range(n):
        if H > sorted_arr[i][0] and A > sorted_arr[i][1]:
            count += 1
            H, A = sorted_arr[i][0], sorted_arr[i][1]
    return count

2 只能一层一层的打

def solution(n: int, H: int, A: int, h: list, a: list) -> int:
    dp = [H,A]
    count = 0
    for i in range(n):
        if h[i] < dp[0] and a[i] < dp[1]:
            dp = [h[i],a[i]]
            count += 1

    return count


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

最佳人选

问题描述

某特种部队采用了一套性格密码机制来筛选执行特定任务的最佳士兵,该机制的规则如下:

每个人的性格可以通过 M 个维度来描述,每个维度分为 A, B, C, D, E 五种类型。 同一维度内,字母距离越近,性格类型差异越小,匹配程度越高。比如,A 和 B 的差异为 1,A 和 D 的差异为 3。 其中 AE、BD、CE、BE 为不相容性格类型,差异值设为无穷大(无法匹配)。 如果某一维度存在不相容性格类型,则表示两个士兵性格完全不匹配。 对于符合匹配条件的士兵,差异值总和越小表示匹配程度越高。 现在,有一个重要的机密任务,要求找到最匹配该任务所需性格密码的士兵。你需要编写一个算法,帮助部队找到符合条件的最佳人选。

  • m 表示性格密码的维度。
  • n 表示备选特种兵的数量。
  • target 是代表任务的性格密码。
  • array 是一个包含 n 个元素的列表,每个元素为 M 位的性格密码。

测试用例

测试样例 样例1:

输入:m = 6, n = 3, target = "ABCDEA", array = ["AAAAAA", "BBBBBB", "ABDDEB"] 输出:'ABDDEB'

样例2:

输入:m = 5, n = 4, target = "ABCED", array = ["ABCDE", "BCDEA", "ABDCE", "EDCBA"] 输出:'ABCDE'

样例3:

输入:m = 4, n = 4, target = "AEBC", array = ["ACDC", "BBDC", "EBCB", "BBBB"] 输出:'None'

思路

题目要求实际上是需要返回所有的最匹配的士兵,而不是任一一个即可。所以需要记录下最匹配的士兵的名单。

整体思路实际就是挨个计算士兵的匹配度,然后记录最匹配的士兵即可。额外需要注意的就是有不相容性格。

实现

def solution(m, n, target, array):
    # Edit your code here
    minSim = float('inf')
    idx = -1
    soldier = []

    for i in range(n):
        simliar = 0
        flag = True
        
        for j in range(m):
            if (target[j] == 'A' or target[j] == 'C' or target[j] == 'B') and array[i][j] == 'E':
                flag = False
                break
            elif target[j] == 'B' and array[i][j] == 'D':
                flag = False
                break
            if (array[i][j] == 'A' or array[i][j] == 'C' or array[i][j] == 'B') and target[j] == 'E':
                flag = False
                break
            elif target[j] == 'D' and array[i][j] == 'B':
                flag = False
                break

            simliar += abs(ord(target[j]) - ord(array[i][j]))
        print(simliar)
        if simliar == minSim and flag:
            soldier.append("".join(array[i]))
        if simliar < minSim and flag:
            minSim = simliar
            soldier = ["".join(array[i])]
            idx = i
    print(array[idx])
    if idx == -1:
        return "None"
    return " ".join(soldier)


if __name__ == "__main__":
    # Add your test cases here
    matrix = [
        "AAAAAA", "BBBBBB", "ABDDEB"
    ]
    print(solution(6, 3, "ABCDEA", matrix) == "ABDDEB")