競技プログラミング日記

主に AtCoder の記事です

AtCoder Beginner Contest 257E

ABC257E

決め方の優先順位

  • \(x\)の桁数の max
  • 桁数を固定したとき,使う値を大きくする
  • 各桁に使う値の multiset を固定したとき,大きい順に並べる

これらを優先順位の通りに求めればよい. 2つ目の条件,桁数を固定したときに使う値を大きくするのは, 9 から降順に貪欲に決めていけばよい.

9から貪欲に決めていく際,binary search でも実装可能. \(i \in [1..9]\) を固定すると,\(i\) を使える個数は 単調であるから.

使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"

int main() {

  ll n; cin >> n;
  vll a(9); rep(i,9) { cin >> a[i]; }

  ll mi  = INFL;
  rep(i,9) chmin(mi, a[i]);


  ll k = n/mi; // ちょうどk桁
  ll rem = n;
  string str;
  drep(j,k){
    drep(i,9){
      if(a[i] + mi*j <= rem){
        rem -= a[i];
        str.push_back(i+1+'0');
        break;
      }
    }
  }
  cout << str << endl;

  return 0;
}