#include #include using namespace std; constexpr int inf = 987'654'321; int f(string s) { s = '0' + s; int n = static_cast(s.size()); // dp[繰り上がったか] := 最小回数 vector dp(2, inf); dp[0] = 0; for(int i=n-1; i>=0; --i) { // 下から vector ndp(2, inf); for(int carry=0; carry<2; ++carry) { if(dp[carry] == inf) { continue; } for(int d : {-1, 0, 1}) { int val = (carry + d + s[i]-'0') % 2, ncarry = (carry + d + s[i]-'0') / 2; if(val != 0) { continue; } ndp[ncarry] = min(ndp[ncarry], dp[carry] + abs(d)); } } dp = ndp; } int res = dp[0]; return res; } int main(void) { string s; cin >> s; int res = f(s); printf("%d\n", res); return 0; }