ABC033_C
1+2*3+0+5*6+7
のように+か*で繋がった式が与えられる.
式の結果が0となるように,式のある値を0に入れ替える.
この時最小の入れ替え回数を求めるという問題.
足し算はそれぞれの値で0と入れ替えなければならない.
掛け算はひとつ0があればよい.
掛け算のほうが足し算より演算の順が先である.
これらを考えると'+'で分ければよいことがわかる.
上の式の場合,このように分けられる.
1
2*3
0
5*6
7
それぞれが0にしなければか?すでに0になっているのか?をカウントしていく.
#include <bits/stdc++.h> using namespace std; vector<string> split(const string &s, char delim) { vector<string> elems; stringstream ss(s); string item; while(getline(ss,item,delim)){ if(!item.empty()){ elems.push_back(item); } } return elems; } bool contain_zero(string s){ for(int i=0;i<(int)s.size();i+=2){ if(s[i]=='0')return true; } return false; } int main() { string s; vector<string> items; cin>>s; items = split(s,'+'); int count = 0; for(int i=0;i<(int)items.size();i++){ if(!contain_zero(items[i]))count++; } cout<<count<<endl; return 0; }
文字列からある文字でスプリットしたいとき
vector<string> split(const string &s, char delim) { vector<string> elems; stringstream ss(s); string item; while(getline(ss,item,delim)){ if(!item.empty()){ elems.push_back(item); } } return elems; }