1 条题解

  • 0
    @ 2025-10-29 17:41:35

    题目解析

    问题分析

    这是一个复杂的状态规划问题,需要帮助 Bajtazar 在满足工作约束的前提下最大化解题时间。关键在于理解他的位置变化和对应的活动限制。

    关键约束

    1. 位置限制

      • 家:不能参加办公室会议,可选择性参加远程会议或解题
      • 路:不能做任何其他事情
      • 办公室:必须工作或参加会议,不能解题
    2. 行程约束

      • 最多去一次办公室
      • 往返各需要 tt 个时间段
      • 必须在第 nn 个时间段前回到家
    3. 工作约束

      • 缺席会议不能超过 kk

    算法思路

    核心思想:枚举办公室停留区间

    代码采用枚举办公室停留时间窗口的策略:

    1. 前缀和预处理:计算三类职责的前缀和,便于快速查询区间和
    2. 情况分类
      • 整天在家(不去办公室)
      • 去办公室并在某个时间段区间 [l,r][l, r] 停留

    具体实现分析

    前缀和数组

    std::vector pre(3, std::vector<int>(n + 1));
    for (int x = 0; x < 3; x++) {
        for (int i = 0; i < n; i++) {
            pre[x][i + 1] = pre[x][i] + (s[i] == '1' + x);
        }
    }
    
    • pre[0]:办公室会议(类型1)的前缀和
    • pre[1]:远程会议(类型2)的前缀和
    • pre[2]:无职责(类型3)的前缀和

    情况1:整天在家

    if (pre[0][n] <= k) {
        ans = std::max(ans, pre[0][n] + pre[2][n] + std::min(pre[1][n], k - pre[0][n]));
    }
    
    • 缺席所有办公室会议:pre[0][n]
    • 解题时间:所有无职责时间 pre[2][n]
    • 可选择缺席的远程会议:min(pre[1][n], k - pre[0][n])

    情况2:去办公室

    for (int l = t; l <= n - t; l++) {
        for (int r = l; r <= n - t; r++) {
            // 计算缺席会议数
            int miss = pre[0][l] + pre[0][n] - pre[0][r] + 
                       pre[1][l] - pre[1][l - t] + 
                       pre[1][r + t] - pre[1][r];
            
            if (miss <= k) {
                // 计算解题时间
                int res = pre[2][l - t] + pre[2][n] - pre[2][r + t] + 
                          pre[0][l - t] + pre[0][n] - pre[0][r + t];
                int can = pre[1][l - t] + pre[1][n] - pre[1][r + t];
                res += std::min(can, k - miss);
                ans = std::max(ans, res);
            }
        }
    }
    

    缺席会议计算

    • pre[0][l]:去办公室路上错过的办公室会议
    • pre[0][n] - pre[0][r]:回家路上错过的办公室会议
    • pre[1][l] - pre[1][l - t]:去办公室路上错过的远程会议
    • pre[1][r + t] - pre[1][r]:回家路上错过的远程会议

    解题时间计算

    • pre[2][l - t]:去办公室前在家的无职责时间
    • pre[2][n] - pre[2][r + t]:回家后在家的无职责时间
    • pre[0][l - t] + pre[0][n] - pre[0][r + t]:在家时缺席的办公室会议
    • 额外缺席的远程会议:min(can, k - miss)

    复杂度分析

    • 时间复杂度O(n2)O(n^2) - 双重循环枚举办公室停留区间
    • 空间复杂度O(n)O(n) - 前缀和数组
    • n8000n \leq 8000 时,O(n2)O(n^2) 算法可行(约6400万次操作)

    算法正确性

    该算法正确性的保证:

    1. 完备性:枚举了所有可能的办公室停留方案
    2. 约束满足:严格检查缺席会议数不超过 kk
    3. 时间计算准确:正确区分在家时间和解题机会
    4. 边界处理:确保往返时间约束得到满足

    优化空间

    虽然 O(n2)O(n^2) 在给定约束下可行,但可以进一步优化:

    • 使用滑动窗口减少内层循环
    • 预处理最优解减少重复计算
    • 利用单调性优化搜索过程

    这个解法体现了枚举关键决策点 + 前缀和快速计算的经典竞赛技巧。

    • 1

    信息

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