1 条题解

  • 0
    @ 2025-10-23 9:56:59

    算法核心思路

    关键观察

    • kk 天来的 aka_k 个客人,每人买的包装编号是:ak,2ak,3ak,a_k, 2a_k, 3a_k, \dots
    • 但如果某个包装已被前面的客人买走,就要跳过它找下一个可用的

    高效解法

    使用 位置指针数组 pos[x]\text{pos}[x] 来记录对于倍数 xx,下一个可用的最小包装编号。

    算法步骤:

    1. 初始化 pos[x]=x\text{pos}[x] = x(每个倍数从自身开始)
    2. 对于第 kk 天的 aka_k 个客人:
      • 对于第 jj 个客人:
        • pos[ak]\text{pos}[a_k] 开始找可用包装
        • 如果 pos[ak]\text{pos}[a_k] 已被购买,则 pos[ak]pos[ak]+ak\text{pos}[a_k] \gets \text{pos}[a_k] + a_k
        • 购买 pos[ak]\text{pos}[a_k],如果它有礼券则记录客人编号
        • 更新 pos[ak]pos[ak]+ak\text{pos}[a_k] \gets \text{pos}[a_k] + a_k

    时间复杂度

    • 每个包装最多被访问一次
    • 总复杂度:O(N+M)O(N + M),其中 NN 是最大包装编号,MM 是总客人数
    • 1

    信息

    ID
    3848
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者