実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 24
問題概要
個の箱が横一列に並んでおり、そのうちのいくつかの箱にはクッキーが入っている。各箱の状態は長さ
の文字列
によって表され、左から
番目の箱は、
@のときクッキーが1枚入っており、.のとき空き箱である。
高橋君はこれから 日間、一日一回ずつ、その時点でクッキーが入っている箱のうち最も右にある箱のクッキーを選んで食べることにする。
個の箱それぞれについて、
日間が経過した後にその箱にクッキーが入っているかを求めよ。
制約
は整数。
には
@が個以上含まれる。
考察
を
reverseすれば、高橋君の行動は
- これから
日間、一日一回ずつ、その時点でクッキーが入っている箱のうち最も左にある箱のクッキーを選んで食べる。
と書き換えられる。これは、「 を先頭から見ていって
@ならば.に置き換えることを、置き換えが 回になるまで繰り返す」ことで実現できる。
あとは再度 を
reverseして出力すれば OK 。
コード
#include <bits/stdc++.h> using namespace std; #define all(x) (x).begin(), (x).end() #define rep(i, start, end) for (auto i = (start); (i) < (end); (i)++) // ======================================== // int main() { int N, D; string S; cin >> N >> D >> S; reverse(all(S)); int cnt = 0; rep(i, 0, N) { if (S[i] == '@') { cnt++; S[i] = '.'; } if (cnt == D) break; } reverse(all(S)); cout << S << endl; }
実装時間: 5分以内
最近の ABC は、「ほぼ同じ設定で条件を難しくしていく」ような出題形式がトレンドになっている気がする。