解题sop
-
题目分析
-
代码分析
-
优化技巧
-
复杂度分析
-
时间复杂度
-
空间复杂度
-
题目-题解
卡牌对弈游戏策略
小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这也不对啊,他怎么每一步都取模一下,输出的结果有点小(不对,都取模和加完取模应该是一样的
改完还是不对,看来要求助一下人工了
找到解决方案了
原因是,即使是分开取模,也是超出内存的,所以一开始的幂运算就要用优化算法
要是用快速幂的方式取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])