1 条题解

  • 0
    @ 2025-11-4 11:45:37

    问题分析

    题目要求在满足每个同学容忍度的前提下,计算食堂做完所有菜的最少时间。关键约束是:第i个同学最多允许紧跟其后的B_i个人先拿到饭菜。做菜时间与前一道菜的口味相关,计算公式为(a or b) - (a and b),该式等价于a异或b(a ^ b)。

    动态规划设计

    状态定义

    使用三维状态f[i][s][last]表示当前处理状态:

    • i:表示当前需要考虑的第i个同学(按原始排队顺序)
    • s:二进制状态压缩,表示在第i个同学之前,其身后哪些同学已被提前处理(利用B_i≤7的特性,用8位二进制即可表示)
    • last:上一个处理的同学的口味值

    状态值为达到该状态所需的最小总时间。

    状态转移

    1. 提前处理后续同学:对于第i个同学,可选择处理其身后的j(1≤j≤B_i)个同学中尚未处理的同学。更新状态时,将对应位置的二进制位设为1,表示该同学已被处理。

    2. 处理当前同学:当决定处理第i个同学时,计算从上个状态转移过来的时间(加上与上一个处理的同学口味的异或值),并更新新状态。此时需要确定下一个要考虑的同学位置j,并调整状态掩码。

    边界条件

    初始状态为f[1][0][*] = 0,表示考虑第1个同学,尚未提前处理任何同学,初始时间为0(第一个菜不需要时间)。

    最终答案

    最终答案为f[n+1][0][*]中的最小值,表示所有同学都已处理完毕,且状态掩码为0的最小总时间。

    复杂度分析

    • 时间复杂度:由于N≤1000,B_i≤7(状态掩码为2^7=128种),口味值≤1000,整体复杂度约为O(N×2^7×1000×7),在可接受范围内。
    • 空间复杂度:使用哈希表存储状态,避免了对所有可能口味值的空间预分配,有效降低了空间消耗。

    该解法通过状态压缩和动态规划,高效地在满足约束条件的前提下找到了最优解。

    算法标签

    • 动态规划(DP)
    • 状态压缩
    • 1

    信息

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