Official

B - Foreign Exchange Editorial by leaf1415


\(i = 1, 2, \ldots, N-1\) の順に「国 \(i\) の通貨を可能な限り国 \(i+1\) の通貨に交換する」ことを行えば良いです。

行う交換の回数は非常に多くなりうるので、\(1\) 回ずつ交換を行うと実行制限時間に間に合いません。 ですが、国 \(i\) の通貨を \(A_i\) 単位持っているとき、国 \(i\) の通貨から国 \(i+1\) の通貨への交換ができる回数は\(\lfloor A_i / S_i \rfloor\) 回とわかるので、\(\lfloor A_i / S_i \rfloor\) 回の交換をまとめて行って国 \(i+1\) の通貨が \(\lfloor A_i / S_i \rfloor \times T_i\) 単位得られるとして良いです。

したがって、入力で受け取った \(A = (A_1, A_2, \ldots, A_N)\)に対して、 \(i = 1, 2, \ldots, N-1\) の順に「 \(A_{i+1}\)\(\lfloor A_i / S_i \rfloor \times T_i\) を加算する」ことを行い、最後に \(A_N\) の値を出力すれば、本問題に正解できます。

\(i = 1, 2, \ldots, N-1\) の順に」処理を行うには、プログラミング言語の標準的な機能である繰り返しの機能( for 文など)を用いることができます。 また、割り算 \(A_i/S_i\) の結果の小数点以下を切り捨てた値を得るには、使用する言語の割り算等の仕様を把握しておくと良いでしょう。

以下に、C++ 言語による本問題の正解例を記載します。

#include <iostream>
using namespace std;
typedef long long ll;

ll n;
ll a[200001], s[200001], t[200001];

int main(void)
{
  cin >> n;
  for(int i = 1; i <= n; i++) cin >> a[i];
  for(int i = 1; i <= n-1; i++) cin >> s[i] >> t[i];
  
  for(int i = 1; i <= n-1; i++) a[i+1] += a[i]/s[i] * t[i];
  cout << a[n] << endl;
  
  return 0;
}

posted:
last update: