语言月赛 202411 卡牌
题目分析
- 小 Z 初始有 $x$ 枚金币,面对 $n$ 个卡包;
- 每个卡包有 $5$ 张卡牌,面额分别在 $1\sim 5$ 之间;
- 小 Z 对每个卡包,只能买一张卡牌,且必须是自己能买得起的面额最大的卡牌;
- 买不起任何卡牌时跳过该卡包;
- 计算最终小 Z 各面额卡牌数量和剩余金币。
解题思路
- 对每个卡包,找到小 $Z$ 能买得起的卡牌中面额最大的一个;
- 若找到则购买(计数加 $1$,金币减少相应面额);
- 否则不买,继续下一个卡包;
- 最后统计各面额卡牌数量和金币剩余。
实现步骤
- 读入初始金币 $x$ 和卡包数量 $n$;
- 初始化一个长度为 $5$ 的数组
cnt
用于统计面额为 $1\sim 5$ 的卡牌购买的数量,定义全局数组初始均为 $0$;
- 对每个卡包,读取 $5$ 张卡牌面额记为
a
;
- 对这 $5$ 张卡牌中能买得起的牌,找到最大面额记为
mx
,初始设为 $0$;
- 即当
a <= x
的情况下,才能执行 mx = max(mx, a)
。
- 如果存在可买的卡牌,则:
x -= mx
,若不存在买得起的,x
就会减去 0
不影响金币数量;
cnt[mx] += 1
;
- 最后输出
cnt[1]
$\sim$ cnt[5]
和剩余金币 x
。
复杂度分析
- 时间复杂度:$O(n)$,每个卡包遍历固定 $5$ 张卡牌;
- 空间复杂度:$O(1)$,统计数组长度固定为 $5$。
总结