#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); } |
English