1 条题解

  • 0
    @ 2026-6-19 10:30:54

    📝 题目大意

    NN 个人按顺序排队购票,每人购票需要 AA 秒。第 ii 个人在 TiT_i 秒时到达队尾(若队伍为空则立即开始购票)。求每个人购票完成的时刻。

    💡 解题思路

    1. 题目分析:题目本质是一个模拟问题,需要按顺序处理每个人的到达和购票过程。关键约束是 TiT_i 严格递增,且 N100N \leq 100,数据范围很小,直接模拟即可。

    2. 算法推导

      • 维护一个变量 current_time,表示上一个人购票完成的时刻(即售票窗口空闲的时刻)。
      • 对于第 ii 个人,其开始购票的时刻 = max(Ti,current_time)\max(T_i, \text{current\_time})
        • 如果 Ti>current_timeT_i > \text{current\_time},说明他到达时队伍已空,可以直接开始,开始时刻为 TiT_i
        • 否则,他到达时前面还有人,需要排队等待,开始时刻为 current_time\text{current\_time}(即上一个人刚完成,他立刻开始)。
      • ii 个人完成的时刻 = 开始时刻 +A+ A,将这个值更新为新的 current_time 并输出。
      • 这个模拟过程天然保证了每个人按顺序、不间断地购票,与 std.cpp 的逻辑完全一致。
    3. 边界与细节

      • 初始时 current_time = 0,第一个人到达时若 T1=0T_1 = 0,则 current_time 直接取 T1T_1;若 T1>0T_1 > 0,同理。
      • AATiT_i 最大可达 10610^6,最终结果可能超过 2×1062 \times 10^6,但仍在 int 范围内(N100N \leq 100,最坏情况约 N×A+TN108N \times A + T_N \approx 10^8,不会溢出 32 位有符号整数)。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N)。只需对 NN 个人各进行一次常数时间的判断和更新操作。
    • 空间复杂度O(N)O(N)。需要存储 NN 个到达时间(T 数组),除此之外仅使用常数个变量。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    int main() {
        int N, A;
        cin >> N >> A;
        vector<int> T(N);
        for (int i = 0; i < N; i++) {
            cin >> T[i];                     // 读入每个人的到达时间
        }
        int current_time = 0;                // 售票窗口空闲的时刻(即上一个人完成购票的时刻)
        for (int i = 0; i < N; i++) {
            if (T[i] > current_time) {       // 到达时队伍已空,可以直接开始
                current_time = T[i];         // 开始时刻 = 到达时刻
            }
            // 否则 T[i] <= current_time,说明需要排队,开始时刻 = current_time(不变)
            current_time += A;               // 购票耗时 A 秒,更新完成时刻
            cout << current_time << endl;    // 输出第 i 个人的完成时刻
        }
        return 0;
    }
    
    • 1

    信息

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