#include <cstdio> #include <algorithm> using namespace std; int digits(int val) { int result = 0; while (val) { val /= 10; result++; } return result; } int n, pow_ten[11]; long long result; int main() { pow_ten[0] = 1; for (int i = 1; i <= 9; i++) pow_ten[i] = pow_ten[i-1] * 10; int prev, a, zeros = 0, add_val = 0; scanf("%d%d", &n, &prev); int prev_digits = digits(prev); while (--n) { scanf("%d", &a); int curr_digits = digits(a); if (curr_digits > prev_digits) { int diff = curr_digits - prev_digits; int added = min(diff, zeros); prev *= pow_ten[added]; zeros = max(0, zeros - added); diff -= added; prev_digits += added; if (diff > 0) { int d = digits(add_val); if (d <= diff) { prev = prev * pow_ten[d] + add_val; add_val = 0; prev_digits += d; } else { prev = prev * pow_ten[diff] + add_val / pow_ten[d - diff]; add_val %= pow_ten[d - diff]; prev_digits = curr_digits; } } } //printf(" %d %d %d %lld\n", prev, zeros, add_val, result); if (curr_digits <= prev_digits) { int diff = prev_digits - curr_digits; int beg = prev / pow_ten[diff]; int end = prev % pow_ten[diff]; //printf(" %d %d\n", curr_digits, prev_digits); if (a != beg) { zeros = diff + zeros + digits(add_val) + (a < beg ? 1 : 0); add_val = 0; result += zeros; prev = a; } else { add_val++; zeros -= digits(add_val) - digits(add_val-1); if (zeros < 0) { end++; zeros = digits(add_val-1); add_val = 0; } //printf(" %d %d\n", end, zeros); result += diff + zeros + digits(add_val); if (end == pow_ten[diff]) { result++; zeros += digits(end); prev = beg; } else { prev = beg * pow_ten[diff] + end; curr_digits = prev_digits; } } } else { prev = a; } prev_digits = curr_digits; } printf("%lld\n", result); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include <cstdio> #include <algorithm> using namespace std; int digits(int val) { int result = 0; while (val) { val /= 10; result++; } return result; } int n, pow_ten[11]; long long result; int main() { pow_ten[0] = 1; for (int i = 1; i <= 9; i++) pow_ten[i] = pow_ten[i-1] * 10; int prev, a, zeros = 0, add_val = 0; scanf("%d%d", &n, &prev); int prev_digits = digits(prev); while (--n) { scanf("%d", &a); int curr_digits = digits(a); if (curr_digits > prev_digits) { int diff = curr_digits - prev_digits; int added = min(diff, zeros); prev *= pow_ten[added]; zeros = max(0, zeros - added); diff -= added; prev_digits += added; if (diff > 0) { int d = digits(add_val); if (d <= diff) { prev = prev * pow_ten[d] + add_val; add_val = 0; prev_digits += d; } else { prev = prev * pow_ten[diff] + add_val / pow_ten[d - diff]; add_val %= pow_ten[d - diff]; prev_digits = curr_digits; } } } //printf(" %d %d %d %lld\n", prev, zeros, add_val, result); if (curr_digits <= prev_digits) { int diff = prev_digits - curr_digits; int beg = prev / pow_ten[diff]; int end = prev % pow_ten[diff]; //printf(" %d %d\n", curr_digits, prev_digits); if (a != beg) { zeros = diff + zeros + digits(add_val) + (a < beg ? 1 : 0); add_val = 0; result += zeros; prev = a; } else { add_val++; zeros -= digits(add_val) - digits(add_val-1); if (zeros < 0) { end++; zeros = digits(add_val-1); add_val = 0; } //printf(" %d %d\n", end, zeros); result += diff + zeros + digits(add_val); if (end == pow_ten[diff]) { result++; zeros += digits(end); prev = beg; } else { prev = beg * pow_ten[diff] + end; curr_digits = prev_digits; } } } else { prev = a; } prev_digits = curr_digits; } printf("%lld\n", result); } |