跳转至

语言月赛 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$。

总结

  • 注意购买后金币减少,不能买超过金币数的卡牌。