1 条题解

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

    📝 题目大意

    NN 个团体排队等待乘坐容量为 KK 的游乐设施。按队列顺序依次处理每个团体:若当前剩余空位足够容纳该团体则让其入座,否则启动设施(清空空位)后再让其入座。所有团体处理完毕后,若设施内还有人则需额外启动一次。求总共启动设施的次数。

    💡 解题思路

    1. 题目分析

      • N,K100N, K \leq 100,数据范围极小,直接模拟即可。
      • 每个团体人数 AiKA_i \leq K,保证单个团体一定能被容纳,不会出现死循环。
      • 团体按队列顺序处理,不能重排,属于典型的贪心模拟题。
    2. 算法推导

      • 维护两个变量:space 表示当前设施剩余空位数(初始为 KK),start_count 记录启动次数(初始为 00)。
      • 遍历每个团体 AiA_i
        • AispaceA_i \leq space:当前团体能坐下,直接 space -= A_i
        • 否则:当前团体坐不下,必须启动设施。start_count++,然后空位重置为 KK 并安排当前团体:space = K - A_i
      • 遍历结束后,若 space < K(即设施内还有人),需要再启动一次:start_count++
      • 最后输出 start_count
    3. 边界与细节

      • Ai=KA_i = Kspace = K 时,能够坐下,space 变为 00,不会触发启动。
      • Ai=spaceA_i = space 时同理,刚好坐满,不触发启动。
      • 最后一趟若设施内有人(space < K),需要补一次启动,这是容易遗漏的 WA 点。
      • N=1N=1 时,团体入座后 space < K,需要额外启动一次,答案为 11

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需一趟线性扫描。
    • 空间复杂度O(N)O(N)(存储数组 AA)或 O(1)O(1)(边读边处理)。

    💻 标准代码 (C++)

    #include <iostream>
    #include <vector>
    using namespace std;
    int main() {
        int N, K;
        cin >> N >> K;
        vector<int> A(N);
        for (int i = 0; i < N; i++) {
            cin >> A[i];
        }
        int space = K;          // 当前设施剩余空位数
        int start_count = 0;    // 启动次数计数器
        for (int i = 0; i < N; i++) {
            if (A[i] <= space) {
                // 当前团体能坐下,直接入座
                space -= A[i];
            } else {
                // 坐不下,启动设施,清空空位后安排当前团体
                start_count++;
                space = K - A[i];
            }
        }
        // 最后一趟若设施内还有人,需要额外启动一次
        if (space < K) {
            start_count++;
        }
        cout << start_count << endl;
        return 0;
    }
    
    • 1

    信息

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