けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 358 B - Ticket Counter (6Q, 灰色, 200 点)

この手のシミュレーションになれることはとても大事!

問題概要

あるチケット売り場は、待合行列がなければ、来た人の受付に  A 秒かかる。

 N 人の人  1, 2, \dots, N は、それぞれ時刻  T_{1}, T_{2}, \dots, T_{N} に到着する。まだ受付されていない人がいる場合は後ろに並ぶ。

 1, 2, \dots, N がそれぞれ受付される時刻を求めよ。

制約

  •  1 \le N \le 100
  •  0 \le T_{1} \lt T_{2} \lt \dots \lt T_{N} \le 10^{6}
  •  1 \le A \le 10^{6}

考えたこと

「現在時刻」 curtime を管理しながらシミュレーションしよう。

 i = 1, 2, \dots, N それぞれについて、前の人  i-1 の受付が終わった時刻を curtime としたとき (人 1 については curtime = 0 とする)、次のように考えます。


  • もし T[i] >= curtime であれば、人  i が売り場に到着したときには受付手続きを開始できる状態であるため、T[i] から  A 秒経過後の値を答える
  • もし T[i] < curtime であれば、人  i が売り場に到着してもすぐに受付できる状態ではなく、curtime まで待つ必要がある。時刻 curtime から  A 秒経過後の値を答える
  • いずれの場合も、curtime の値を適切な値に更新しておく

あとは、この手続きを実装すればよいでしょう。

コード

#include <bits/stdc++.h>
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 curtime = 0;
    for (int i = 0; i < N; ++i) {
        if (curtime < T[i]) curtime = T[i];
        curtime += A;
        cout << curtime << endl;
    }
}