OI XXXII - zam

// https://sio2.mimuw.edu.pl/c/oi32-1/p/zam/
// Zamek cykliczny

#include <bits/stdc++.h>

#define int long long

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

namespace brut {
std::string cyclicShift(const std::string& num) {
    int len = num.size();
    if (len == 1) return num;

    std::string shifted = num.substr(1) + num[0];
    while (shifted.size() > 1 && shifted[0] == '0') {
        shifted.erase(shifted.begin());
    }
    return shifted;
}

int minOperationsToReachOne(const std::string& n) {
    std::unordered_set<std::string> visited;
    std::queue<std::pair<std::string, int>> q;

    q.push({n, 0});
    visited.insert(n);

    while (!q.empty()) {
        auto [current, steps] = q.front();
        q.pop();

        if (current == "1") {
            return steps;
        }

        std::string addOne = std::to_string(stoll(current) + 1);
        if (visited.find(addOne) == visited.end()) {
            visited.insert(addOne);
            q.push({addOne, steps + 1});
        }

        std::string shifted = cyclicShift(current);
        if (visited.find(shifted) == visited.end()) {
            visited.insert(shifted);
            q.push({shifted, steps + 1});
        }
    }

    return -1;
}

}

std::string removeLeadingZeroes(const std::string& input) {
    size_t nonZeroPos = input.find_first_not_of('0');

    if (nonZeroPos == std::string::npos) {
        return "0";
    }

    return input.substr(nonZeroPos);
}

int solve_for_one_digit(char c) {
    if (c == '1') {
        return 0;
    }

    return (11 - (c - '0'));
}

constexpr int HOW_MIK = 7;
constexpr int INF = INT64_MAX;

int classic_count_op(const std::string& local_n) {
    int ans = 0;
    int l = local_n.size();

    int num_ofNot9 = 0;
    for (const auto& c : local_n) {
        if (c != '9') num_ofNot9++;
    }

    if (local_n.back() != '9' && local_n.back() != '0') {
        ans += 9 - (local_n.back() - '0');
        num_ofNot9--;
    }

    int i = 0;
    while (num_ofNot9 > 0) {
        if (local_n[i] != '0') {
            ans += 9 - (local_n[i] - '0') + 1;
            if (local_n[i] != '9') {
                num_ofNot9--;
            }
        } else {
            num_ofNot9--;
        }
        i++;
    }

    return ans;
}

std::string int_to_2(int x) {
    return std::bitset<8>(x).to_string();
}

void solve() {
    std::string n;
    std::cin >> n;

    n = removeLeadingZeroes(n);
    if (n == "0") {
        std::cout << "1\n";
        return;
    }

    int l = n.size();

#ifndef GARY_DBG
    if (l <= 6) {
        std::cout << brut::minOperationsToReachOne(n) << '\n';
        return;
    }
#endif

    if (l == 1) {
        int ansix = solve_for_one_digit(n[0]);
        std::cout << ansix << '\n';

        return;
    }

    int num_of0 = 0;
    for (const auto& c : n) {
        if (c == '0') num_of0++;
    }

    if (num_of0 + 1 == l) {
        int ansix = solve_for_one_digit(n[0]) + 1;
        std::cout << ansix << '\n';

        return;
    }

    int ans = INF;
    int local_HOW_MIK = std::min(HOW_MIK, l);

    for (int i = 0; i < (1 << local_HOW_MIK); i++) {
        int tmp = i, local_ans = 0;
        std::string copy_n = n;
        for (int j = l - 1, k = 0; k < local_HOW_MIK; j--, k++) {
            if ((tmp % 2) == 1) {
                // dodaj ..
                local_ans += (9 - (n[j] - '0')) * pow(10, k);
                copy_n[j] = '9';
            }

            tmp /= 2;
        }

        int dod_op = classic_count_op(copy_n);

        local_ans += 2 + dod_op;

        ans = std::min(ans, local_ans);
    }

    std::cout << ans << '\n';
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}