#include <bits/stdc++.h> int n, a; long long int p, k, s; long long int wynik; int max=200000; struct slowo{ long long int pocz; int dl; int zera; int pozostale; }; slowo tab[200003]; long long int pot[20]; void uzupelnij() { pot[0]=1; for(int i=1; i<18; i++) pot[i]=pot[i-1]*10LL; } int main() { scanf("%d", &n); uzupelnij(); for(int i=1; i<=n; i++) { scanf("%lld", &tab[i].pocz); a=tab[i].pocz; while(a>0) { tab[i].dl++; a/=10; } } for(int i=2; i<=n; i++) { /* printf("I = %d\n", i); */ /* printf("%lld[%d] %lld\n", tab[i-1].pocz, tab[i-1].zera, tab[i].pocz); */ if(tab[i-1].dl+tab[i-1].zera<tab[i].dl+tab[i].zera) { /* printf("NA STRACIE JEST ROWNOSC\n"); */ continue; } tab[i].zera=tab[i-1].dl+tab[i-1].zera-tab[i].dl; wynik+=tab[i-1].dl+tab[i-1].zera-tab[i].dl; /* printf("DODALISMY %d ZER\n", tab[i-1].dl+tab[i-1].zera-tab[i].dl); */ if(tab[i].pocz/pot[std::max(0, tab[i].dl-tab[i-1].dl)]>tab[i-1].pocz/pot[std::max(0, tab[i-1].dl-tab[i].dl)]) { tab[i].pozostale=(tab[i].zera==0) ? 0 : pot[std::min(tab[i].zera, 17)]-1; continue; } if(tab[i].pocz/pot[std::max(0, tab[i].dl-tab[i-1].dl)]<tab[i-1].pocz/pot[std::max(0, tab[i-1].dl-tab[i].dl)]) { wynik++; tab[i].zera++; tab[i].pozostale=(tab[i].zera==0) ? 0 : pot[std::min(tab[i].zera, 17)]-1; continue; } if(tab[i].pocz/pot[std::max(0, tab[i].dl-tab[i-1].dl)]==tab[i-1].pocz/pot[std::max(0, tab[i-1].dl-tab[i].dl)]) { if(tab[i-1].pozostale>0) tab[i].pozostale=tab[i-1].pozostale-1; else { wynik++; tab[i].zera++; tab[i].pozostale=(tab[i].zera==0) ? 0 : pot[std::min(tab[i].zera, 17)]-1; } continue; } } printf("%lld\n", wynik); }
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 | #include <bits/stdc++.h> int n, a; long long int p, k, s; long long int wynik; int max=200000; struct slowo{ long long int pocz; int dl; int zera; int pozostale; }; slowo tab[200003]; long long int pot[20]; void uzupelnij() { pot[0]=1; for(int i=1; i<18; i++) pot[i]=pot[i-1]*10LL; } int main() { scanf("%d", &n); uzupelnij(); for(int i=1; i<=n; i++) { scanf("%lld", &tab[i].pocz); a=tab[i].pocz; while(a>0) { tab[i].dl++; a/=10; } } for(int i=2; i<=n; i++) { /* printf("I = %d\n", i); */ /* printf("%lld[%d] %lld\n", tab[i-1].pocz, tab[i-1].zera, tab[i].pocz); */ if(tab[i-1].dl+tab[i-1].zera<tab[i].dl+tab[i].zera) { /* printf("NA STRACIE JEST ROWNOSC\n"); */ continue; } tab[i].zera=tab[i-1].dl+tab[i-1].zera-tab[i].dl; wynik+=tab[i-1].dl+tab[i-1].zera-tab[i].dl; /* printf("DODALISMY %d ZER\n", tab[i-1].dl+tab[i-1].zera-tab[i].dl); */ if(tab[i].pocz/pot[std::max(0, tab[i].dl-tab[i-1].dl)]>tab[i-1].pocz/pot[std::max(0, tab[i-1].dl-tab[i].dl)]) { tab[i].pozostale=(tab[i].zera==0) ? 0 : pot[std::min(tab[i].zera, 17)]-1; continue; } if(tab[i].pocz/pot[std::max(0, tab[i].dl-tab[i-1].dl)]<tab[i-1].pocz/pot[std::max(0, tab[i-1].dl-tab[i].dl)]) { wynik++; tab[i].zera++; tab[i].pozostale=(tab[i].zera==0) ? 0 : pot[std::min(tab[i].zera, 17)]-1; continue; } if(tab[i].pocz/pot[std::max(0, tab[i].dl-tab[i-1].dl)]==tab[i-1].pocz/pot[std::max(0, tab[i-1].dl-tab[i].dl)]) { if(tab[i-1].pozostale>0) tab[i].pozostale=tab[i-1].pozostale-1; else { wynik++; tab[i].zera++; tab[i].pozostale=(tab[i].zera==0) ? 0 : pot[std::min(tab[i].zera, 17)]-1; } continue; } } printf("%lld\n", wynik); } |