実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 163
問題概要
から までの番号が付いた 個の国があり、 について、国 の通貨を 単位持っている。以下の操作を0回以上繰り返して、最終的に持てる国 の通貨の単位数としてあり得る最大値を出力せよ。
- 操作 : 国 の通貨を 単位以上持っているなら、「国 の通貨を 単位支払い、国 の通貨を 単位得る」という行動を1回行う。
制約
- 入力はすべて整数
考察
操作を行うことで、番号の小さい国の通貨を番号の大きい国の通貨へ変換できるので、各国に対して操作をできる限り行っていけば、最終的な国 の通貨の単位数を最大化できる。 なので、操作の結果をシュミレーションしていけばよい。国 については、 のとき、硬貨の交換を 回行うことができる。
コード
#include <bits/stdc++.h> using namespace std; using ll = long long; #define rep(i, start, end) for (ll i = (start); i < (ll)(end); i++) // ======================================== // int main() { int N; cin >> N; vector<ll> A(N + 1); rep(i, 1, N + 1) cin >> A[i]; vector<ll> S(N), T(N); rep(i, 1, N) cin >> S[i] >> T[i]; rep(i, 1, N) { if (A[i] >= S[i]) { A[i + 1] += T[i] * (A[i] / S[i]); A[i] %= S[i]; } } cout << A[N] << endl; }
実装時間: 10分