豆包MarsCode AI 刷题

84 阅读5分钟

问题描述 生物学家小 R 正在研究一种特殊的兔子品种的繁殖模式。这种兔子的繁殖遵循以下规律:

每对成年兔子每个月会生育一对新的小兔子(一雌一雄)。 新生的小兔子需要一个月成长,到第二个月才能开始繁殖。 兔子永远不会死亡。 小 R 从一对新生的小兔子开始观察。他想知道在第 A 个月末,总共会有多少对兔子。

请你帮助小 R 编写一个程序,计算在给定的月份 A 时,兔子群体的总对数。

注意:

初始时有 1 对新生小兔子。 第 1 个月末有 1 对兔子:原来那对变成了成年兔子,并开始繁殖。 第 2 个月末有 2 对兔子:原来那 1 对成年兔子,繁殖了 1 对新生的小兔子。 从第 3 个月开始,兔子群体会按照上述规律增长。

输入 一个整数 A(1 ≤ A ≤ 50),表示月份数。

返回 一个长整数,表示第 A 个月末兔子的总对数。

测试样例 样例1:

输入:A = 1 返回:1

样例2:

输入:A = 5 返回:8

样例3:

输入:A = 15 返回:987

解题思路: 问题理解 这个问题实际上是一个经典的斐波那契数列问题。每对兔子在一个月后变成成年兔子,并且从第二个月开始每个月都会生育一对新的小兔子。因此,兔子的数量增长符合斐波那契数列的规律。

数据结构选择 由于我们只需要记录每个月的兔子对数,并且可以通过前两个月的兔子对数推导出当前月的兔子对数,因此我们可以使用一个数组 dp 来存储每个月的兔子对数。

算法步骤 初始化:

第一个月(dp[1])有 1 对兔子。 第二个月(dp[2])有 2 对兔子。 递推关系:

从第三个月开始,每个月的兔子对数等于前两个月的兔子对数之和,即 dp[i] = dp[i-1] + dp[i-2]。 计算:

从第三个月开始,依次计算每个月的兔子对数,直到第 A 个月。 返回结果:

返回第 A 个月的兔子对数 dp[A]。 最终代码: def solution(n): # 使用动态规划来保存前两个月的兔子对数 if n == 1: return 1 # 第一个月 if n == 2: return 2 # 第二个月

dp = [0] * (n + 1)  # dp[i] 表示第 i 个月的兔子对数
dp[1] = 1  # 第一个月
dp[2] = 2  # 第二个月

# 计算每个月的兔子对数
for i in range(3, n + 1):
    dp[i] = dp[i - 1] + dp[i - 2]  # 递推公式

return dp[n]  # 返回第 n 个月的兔子对数

if name == "main": # 验证输出结果是否符合预期 print(solution(5) == 8) print(solution(1) == 1) print(solution(15) == 987) # print(solution(50) == 20365011074) # 这个数字比较大,如果需要可以打开这一行进行测试

问题描述

在一场经典的德州扑克游戏中,有一种牌型叫做“葫芦”。“葫芦”由五张牌组成,其中包括三张相同牌面值的牌 aa 和另外两张相同牌面值的牌 bb。如果两个人同时拥有“葫芦”,我们会优先比较牌 aa 的大小,若牌 aa 相同则再比较牌 bb 的大小。

在这个问题中,我们对“葫芦”增加了一个限制:组成“葫芦”的五张牌牌面值之和不能超过给定的最大值 maxmax。牌面值的大小规则为:A > K > Q > J > 10 > 9 > ... > 2,其中 A 的牌面值为1,K 为13,依此类推。

给定一组牌,你需要找到符合规则的最大的“葫芦”组合,并输出其中三张相同的牌面和两张相同的牌面。如果找不到符合条件的“葫芦”,则输出 “0, 0”。

测试样例 样例1:

输入:n = 9, max = 34, array = [6, 6, 6, 8, 8, 8, 5, 5, 1] 输出:[8, 5]

样例2:

输入:n = 9, max = 37, array = [9, 9, 9, 9, 6, 6, 6, 6, 13] 输出:[6, 9]

样例3:

输入:n = 9, max = 40, array = [1, 11, 13, 12, 7, 8, 11, 5, 6] 输出:[0, 0]

解题思路:

问题理解

我们需要找到一组牌中符合“葫芦”规则的最大组合。具体来说,“葫芦”由三张相同牌面值的牌和两张相同牌面值的牌组成,并且这五张牌的牌面值之和不能超过给定的最大值 max

算法步骤 统计每种牌面值的出现次数:遍历输入的牌数组,统计每种牌面值的出现次数。 寻找符合条件的“葫芦”: 遍历统计结果,找到所有出现次数大于等于3的牌面值,记为 a。 对于每个 a,再遍历统计结果,找到所有出现次数大于等于2的牌面值,记为 b。 计算 a 和 b 的牌面值之和,如果不超过 max,则记录这个组合。 选择最大的“葫芦”:在所有符合条件的组合中,选择牌面值最大的 a 和 b。

from collections import defaultdict

def solution(n, max_sum, array):

# 牌面值的映射
card_value = {
    1: 14,  # A
    13: 13, # K
    12: 12, # Q
    11: 11, # J
    10: 10, # 10
    9: 9,   # 9
    8: 8,   # 8
    7: 7,   # 7
    6: 6,   # 6
    5: 5,   # 5
    4: 4,   # 4
    3: 3,   # 3
    2: 2    # 2
}

# 统计每种牌面值的出现次数
count = defaultdict(int)
for card in array:
    adjusted_card = card if card != 1 else 14
    count[adjusted_card] += 1

# 寻找符合条件的“葫芦”
num3 = 0
num2 = 0
current_sum = 0
for key, value in count.items():
    if value >= 3:
        for other_key, other_value in count.items():
            if other_key != key and other_value >= 2:
                sum_value = calculate_sum(key if key != 14 else 1, other_key if other_key != 14 else 1)
                if sum_value <= max_sum:
                    if key > num3 or (key == num3 and other_key > num2):
                        num3 = key
                        num2 = other_key
                        current_sum = sum_value

# 返回结果
if current_sum > 0:
    return [num3 if num3 != 14 else 1, num2 if num2 != 14 else 1]
else:
    return [0, 0]

def calculate_sum(num1, num2): return num1 * 3 + num2 * 2

测试用例

result1 = solution(9, 34, [6, 6, 6, 8, 8, 8, 5, 5, 1]) print(result1 == [8, 5])

result2 = solution(9, 37, [9, 9, 9, 9, 6, 6, 6, 6, 13]) print(result2 == [6, 9])

result3 = solution(9, 40, [1, 11, 13, 12, 7, 8, 11, 5, 6]) print(result3 == [0, 0])