#include <algorithm> #include <iostream> #include <string> using namespace std; typedef long long ll; typedef long long ull; const int MAXN = 2e5 + 1; #define bzero(x) max(0LL, (x)) #define lmaxi(x) min(17LL, x) ull pw[20]; #define all(x) x.begin(), x.end() int get_log(ll x) { int ans = 0; while(x) { ++ans; x /= 10; } return ans; } int N; ll answer; ll a[MAXN]; ll pom[MAXN][3]; int main() { pw[0] = 1; for(int i = 1; i < 19; ++i) pw[i] = pw[i - 1] * 10; ios_base::sync_with_stdio(NULL); cout.tie(NULL); cin.tie(NULL); cin >> N; for(int i = 0; i < N; ++i) cin >> a[i], pom[i][0] = get_log(a[i]); for(int i = 1; i < N; ++i) { if(pom[i - 1][0] + pom[i - 1][1] < pom[i][0] + pom[i][1]) continue; pom[i][1] = pom[i - 1][0] + pom[i - 1][1] - pom[i][0]; answer += pom[i][1]; if((a[i] / pw[bzero(pom[i][0] - pom[i - 1][0])]) > (a[i - 1] / pw[bzero(pom[i - 1][0] - pom[i][0])])) { pom[i][2] = (pom[i][1] == 0) ? 0 : pw[min(17LL, pom[i][1])] - 1; } else if((a[i] / pw[bzero(pom[i][0] - pom[i - 1][0])]) == (a[i - 1] / pw[bzero(pom[i - 1][0] - pom[i][0])])) { if(pom[i - 1][2] <= 0) { ++answer, ++pom[i][1]; pom[i][2] = (pom[i][1] == 0) ? 0 : pw[min(17LL, pom[i][1])] - 1; } else pom[i][2] = pom[i - 1][2] - 1; } else { ++answer, ++pom[i][1]; pom[i][2] = (pom[i][1] == 0) ? 0 : pw[min(17LL, pom[i][1])] - 1; } } cout << answer << endl; return 0; }
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 | #include <algorithm> #include <iostream> #include <string> using namespace std; typedef long long ll; typedef long long ull; const int MAXN = 2e5 + 1; #define bzero(x) max(0LL, (x)) #define lmaxi(x) min(17LL, x) ull pw[20]; #define all(x) x.begin(), x.end() int get_log(ll x) { int ans = 0; while(x) { ++ans; x /= 10; } return ans; } int N; ll answer; ll a[MAXN]; ll pom[MAXN][3]; int main() { pw[0] = 1; for(int i = 1; i < 19; ++i) pw[i] = pw[i - 1] * 10; ios_base::sync_with_stdio(NULL); cout.tie(NULL); cin.tie(NULL); cin >> N; for(int i = 0; i < N; ++i) cin >> a[i], pom[i][0] = get_log(a[i]); for(int i = 1; i < N; ++i) { if(pom[i - 1][0] + pom[i - 1][1] < pom[i][0] + pom[i][1]) continue; pom[i][1] = pom[i - 1][0] + pom[i - 1][1] - pom[i][0]; answer += pom[i][1]; if((a[i] / pw[bzero(pom[i][0] - pom[i - 1][0])]) > (a[i - 1] / pw[bzero(pom[i - 1][0] - pom[i][0])])) { pom[i][2] = (pom[i][1] == 0) ? 0 : pw[min(17LL, pom[i][1])] - 1; } else if((a[i] / pw[bzero(pom[i][0] - pom[i - 1][0])]) == (a[i - 1] / pw[bzero(pom[i - 1][0] - pom[i][0])])) { if(pom[i - 1][2] <= 0) { ++answer, ++pom[i][1]; pom[i][2] = (pom[i][1] == 0) ? 0 : pw[min(17LL, pom[i][1])] - 1; } else pom[i][2] = pom[i - 1][2] - 1; } else { ++answer, ++pom[i][1]; pom[i][2] = (pom[i][1] == 0) ? 0 : pw[min(17LL, pom[i][1])] - 1; } } cout << answer << endl; return 0; } |