1 条题解

  • 0
    @ 2026-8-19 9:50:32

    题解

    队列中保存:

    任务编号 + 剩余时间
    

    每次取队首,执行:

    run = min(k, remain);
    

    把总时间增加 run。

    如果剩余时间变成 0,就输出完成信息;否则重新放到队尾。

    这是“先到先处理,但未完成任务重新排到末尾”的典型队列应用。

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        long long k;
        cin >> n >> k;
    
        queue<pair<int,long long>> q;
        for (int i=1;i<=n;++i) {
            long long t; cin >> t;
            q.push({i,t});
        }
    
        long long now=0;
    
        while (!q.empty()) {
            auto [id, rem] = q.front();
            q.pop();
    
            long long run=min(k,rem);
            now += run;
            rem -= run;
    
            if (rem==0) cout << id << ' ' << now << '\n';
            else q.push({id,rem});
        }
    
        return 0;
    }
    
    • 1

    信息

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