紙媒体で管理するとなくなりがちなのでブログで進捗などを管理することにしました
※殆どの記事は自分自身のためだけにかいています.他人に見せられるレベルには至っていません...

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;
}