区間を分割するアルゴリズム
区間を分割して数え上げをするときの実装について質問があります。
AtCoderABC033_C
こちらの問題です。
次のような制約を満たす数式
Sが与えられます。
演算子は + (加算) と * (乗算) のみからなる。乗算を優先して計算する。括弧は存在しない。それぞれの項は、 1桁の整数である。
例えば、1+340 、 1+2+3+4+5 などの数式はこの条件を満たしますが、12+3+5、467-3、(3+4)*5+2 のような数式は 条件を満たさないため、入力として与えられません。
あなたは、この数式のうち数字の部分をいくつか選んで 0 に書き換えることで、この式の値を 0にしたいです。式の値を 0にするために 0 に書き換えなければならない数字の個数の最小値を求めてください。
問題の実装方針としては +
の数の数え上げと+
で囲まれた区間内に0
が存在すればそれを数えて次の区間へ移動するということです。
私の実装
こちらの実装で問題は解けます。
C++
1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 string s; 6 cin >> s; 7 int p_cnt = 1, zero_cnt = 0; 8 9 for(int i=0; i<s.size(); i++) { 10 if(s[i] == '+') p_cnt++; // +の数を数え上げ 11 12 // 区間内に0があればwhile文でインクリメントして次の区間に移動 13 if(s[i] == '0') { 14 zero_cnt++; 15 while(s[i+1] != '+' && i+1 < s.size()) { 16 i++; 17 } 18 } 19 } 20 cout << p_cnt - zero_cnt << endl; 21}
質問
区間を区切って、次の区間に移動する際のwhile
の実装は他にどのようなものが考えられるでしょうか?
私の実装だとwhile(s[i+1] != '+' && i+1 < s.size())
でプラスの前までindexを増やし、for文の判定でもう一度インクリメントするというのは、少々わかりにくいコードになってしまっているような気がします。
こっちのコードの方が良い。または、他にも実装がありましたら教えていただきたいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/09 15:56