srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

ABC 033 C - 数式の書き換え

問題

問題概要

和と積の計算式があたえられる。計算結果を0にするためにはいくつの数を0にすれば良いか。その最小値を求めよ。

解法

数字がすべて1桁なので、マイナスとかもありえない。だから、'+'の間の式の計算結果がすべて0であれば、全体の計算結果も0となる。
31+12
の場合、31と12がともに0になればよい。このばあい、31でどちらか、12でどちらかを0にすれば、0になる。
'+'の間の式は、'*' で構成されているので、1つを0にするだけで十分である。ただし、一つでも0がすでに含まれていれば、一つも0にする必要はなくなる。

ミス

なし。

コード

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vint;
typedef pair<int,int> pint;
typedef vector<pint> vpint;
#define rep(i,n) for(int i=0;i<(n);i++)
#define reps(i,f,n) for(int i=(f);i<(n);i++)
#define each(it,v) for(__typeof((v).begin()) it=(v).begin();it!=(v).end();it++)
#define all(v) (v).begin(),(v).end()
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define chmax(a, b) a = (((a)<(b)) ? (b) : (a))
#define chmin(a, b) a = (((a)>(b)) ? (b) : (a))
const int MOD = 1e9 + 7;
const int INF = 1e9;

int main(void){
    string s; cin >> s;
    bool flag = true;
    int ans = 0;    
    for(auto u : s){
        if(u == '+'){
            if(flag) ans++;
            flag = true;
        }else if(u == '0'){
            flag = false;
        }
    }
    if(flag) ans++;
    cout << ans << endl;
}