Official

B - バスの到着時刻 / Bus Arrival Time Editorial by physics0523


路線 \(i\) について、時刻 \(T\) 以降で最初に到着するバスの到着時刻は以下の式で表現できます。

  • \(\displaystyle \left \lceil \frac{T}{A_i} \right \rceil \times A_i\)   (ただし、 \(\lceil x \rceil\)\(x\) の小数点以下切り上げ)

理由:
求めるバスの到着時刻は \(kA_i \ge T\) なる最小の非負整数 \(k\) を用いて \(kA_i\) と表現されます。 \(k \ge \frac{T}{A_i}\) なる最小の非負整数は \(\lceil \frac{T}{A_i} \rceil\) であり、到着時刻は \(\lceil \frac{T}{A_i} \rceil \times A_i\) です。

整数 \(p \ge 0, q>0\) について、 \(\lceil \frac{p}{q} \rceil\)\(\lfloor \frac{p+q-1}{q} \rfloor\) と等しく、この形の方が実装に落とし込みやすいです。 参考記事

これを全ての路線について求め、最小値を取ることでこの問題に正答できます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  int N,T;
  cin >> N >> T;
  int res=2.1e9;
  for(int i=0;i<N;i++){
    int A;
    cin >> A;
    res=min(res,((T+A-1)/A)*A);
  }
  cout << res << "\n";
  return 0;
}

posted:
last update: