公式
E - Addition and Multiplication 2 解説 by nok0
最終的な \(x\) の桁数を考えると、桁数が大きいほど \(x\) が大きいことから桁数を最大化する必要があることがわかります。
桁数の最大値は \(\lfloor \frac{N}{\mathrm{min}(C)}\rfloor\) で求まります。
桁数が定まると辞書順の比較となるため、後は先頭から貪欲に値を決めていけば良いです。適切な実装により \(\mathrm{Ο}(N)\) でこの問題を解くことができます。詳しくは実装例をご覧ください。
実装例(c++):
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
vector<int> c(10);
for(int i = 1; i <= 9; i++) cin >> c[i];
int mn = *min_element(c.begin() + 1, c.end());
int length = n / mn;
string ans = "";
for(int i = 0; i < length; i++) {
for(int j = 9; j >= 1; j--) {
if((ll)mn * (length - 1 - i) + c[j] <= n) {
n -= c[j];
ans.push_back((char)('0' + j));
break;
}
}
}
cout << ans << endl;
return 0;
}
投稿日時:
最終更新: