本博客含有两道题目:游戏英雄升级潜力评估;卡牌翻面求和问题
游戏英雄升级潜力评估
问题描述
小U在一款挂机游戏中拥有n个英雄。游戏中有一种历练升级机制,每天可以选择两个英雄进行历练,如果两位英雄的等级相同,则他们的等级都不会改变。如果英雄等级不同,那么等级较高的英雄会增加1级,而等级较低的英雄则保持不变。
小U希望至少有一个英雄能够达到2000000000000000级,他想知道有多少英雄有潜力通过历练达到这个等级。
我的思路
本题的规则是存在比自己等级低的才可以升级,也就是说除了等级最低的英雄无法升级,其余英雄均可以升级。因此可以统计最低等级英雄的数量,并用总数减去这个数量。
豆包思路
- 找到最小等级:使用
min(u)。 - 移除最小等级的英雄:使用列表推导式
[level for level in u if level != min_level]来移除所有等级等于最小等级的英雄。 - 计算剩余英雄数:使用
len(u)来计算剩余的英雄数。
融合思路并编程
我的思路与豆包思路大致相同,不同之处是我会使用sorted先进行排序,然后在统计最小等级的次数,而不是使用列表推导式进行计算。这样可以减少比较次数,算法更加优良。
def solution(n: int, u: list) -> int:
# write code here
minNum=min(u)
num=0
u=sorted(u)
for i in range(n):
if minNum==u[i]:
num+=1
else:break
return n-num
# 豆包代码
def solution(n: int, u: list) -> int:
# 找到最小等级
min_level = min(u)
# 移除所有等级等于最小等级的英雄
# 提示:使用列表推导式或循环来移除元素
u = [level for level in u if level != min_level]
# 返回剩余英雄数
return len(u)
卡牌翻面求和问题
问题描述
小M有 nn 张卡牌,每张卡牌的正反面分别写着不同的数字,正面是 aia**i,背面是 bib**i。小M希望通过选择每张卡牌的一面,使得所有向上的数字之和可以被3整除。你需要告诉小M,一共有多少种不同的方案可以满足这个条件。由于可能的方案数量过大,结果需要对 109+7109+7 取模。
例如:如果有3张卡牌,正反面数字分别为 (1,2),(2,3) 和 (3,2),你需要找到所有满足这3张卡牌正面或背面朝上的数字之和可以被3整除的组合数。
我的思路
我最初的想法就是遍历所有情况,然后返回最终结果。
豆包思路
- 初始化
dp数组:dp = [1, 0, 0]表示初始状态下,和为0的组合数为1,和为1和2的组合数为0。 - 更新
dp数组:对于每一张卡牌,我们创建一个新的new_dp数组,并根据当前卡牌的正面和背面数字更新new_dp。 - 返回结果:最终,
dp[0]就是所有卡牌的正面或背面朝上的数字之和可以被3整除的组合数。
融合思路并编程
豆包使用动态规划来解决这个问题,并且使用一个数组dp 来记录当前所有可能的和模3的结果,比我的方法更加简洁,所以采用豆包的思路进行解决。
def solution(n: int, a: list, b: list) -> int:
MOD = 10**9 + 7
dp = [1, 0, 0]
for i in range(n):
new_dp = [0, 0, 0]
for j in range(3):
new_dp[(j + a[i]) % 3] = (new_dp[(j + a[i]) % 3] + dp[j]) % MOD
new_dp[(j + b[i]) % 3] = (new_dp[(j + b[i]) % 3] + dp[j]) % MOD
dp = new_dp
return dp[0]