草体にぼ日記

だらだらと

ARC073C Sentou

ARC073C Sentou

ARC073C Sentou

提出AC

int main()
{
    cout <<setprecision(10);
    ll N , T ;
    cin >>  N >> T;
    vector<ll> time(N);
    rep(i,N) cin >> time[i];
 
    ll ans = 0;
    ll clock = 0 ;
    rep(i,N){
        ans += time[i] + T - max(clock,time[i]);
        clock = time[i]+T;
    }
    cout << ans << endl;
}

解法

(最近精進してなくてどうやって書けばいいか思い出せねえ)

水が止まってから次の人がボタンを押してくれると、水の流れる時間は長くなる

N人までの人iに対して、

ボタンを押して水が止まる時間をclock変数に入れておく(初期値は0)

すると、i+1人目が来たときに、

  • clockよりもtime[i]が小さければ止まる前にボタンを押すことになる。

このときi+1人が押したことによって流れる水の時間はtime[i]+T - clock;

  • clockがt[i]よりも小さければ、水が止まってからi+1人目がボタンを押すことになるので

i+1人目が押したことによって流れる水の時間はT + time[i+1] - time [i+1]つまり T

これらを二つ合わせると

ans += time[i] + T - max(clock , time[i])

となる

そしてclock をtime[i] + T に変更すればいい

説明のところちょっとi+1がバラバラになっててごめん