#include <iostream> #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("rename-registers") using namespace std; int const MAXN = 2e5+5; int N; long long wynik=0; string t[MAXN]; string n; bool porownaj(string s, string t) { if(s.size()!=t.size()) return s.size()<t.size(); else { //cout<<1<<' '<<s<<' '<<t<<endl; for(int i=0; i<s.size(); i++) { //cout<<bool(s[i]<t[i])<<endl; if(s[i]!=t[i]) return s[i]<t[i]; // cout<<s<<' '<<t<<endl; } return 0; } } void dodaj() { int pamiec=0; if(n[n.size()-1]==9) { n[n.size()-1]=0; pamiec=1; int cyfra=n.size()-2; while(pamiec==1) { if(n[cyfra]==9) { n[cyfra]=0; cyfra--; } else { n[cyfra]++; pamiec=0; } } } else { n[n.size()-1]++; } } bool dopasuj (int i) { if(porownaj (t[i-1],t[i]) == 1) return 0; else { string m = t[i]; int ile=0; //cout<<porownaj (m, t[i-1])<<endl; while (porownaj (t[i-1], m)==0) { m+="9"; ile++; } wynik+=ile; for(int j=0; j<ile; j++) {t[i]+="0";} if(porownaj(t[i-1], t[i])==0) { n = t[i-1]; n.erase(0, n.size()-ile); dodaj(); t[i].erase((t[i].size()-ile), t[i].size()); t[i]+=n; } // cout<<i<<' '<<t[i]<<endl; return 0; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>N; for(int i=0; i<N; i++) cin>>t[i]; for(int i=1; i<N; i++) { dopasuj(i); //do poprzedniego //cout<<t[i]<<endl; } cout<<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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 | #include <iostream> #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("rename-registers") using namespace std; int const MAXN = 2e5+5; int N; long long wynik=0; string t[MAXN]; string n; bool porownaj(string s, string t) { if(s.size()!=t.size()) return s.size()<t.size(); else { //cout<<1<<' '<<s<<' '<<t<<endl; for(int i=0; i<s.size(); i++) { //cout<<bool(s[i]<t[i])<<endl; if(s[i]!=t[i]) return s[i]<t[i]; // cout<<s<<' '<<t<<endl; } return 0; } } void dodaj() { int pamiec=0; if(n[n.size()-1]==9) { n[n.size()-1]=0; pamiec=1; int cyfra=n.size()-2; while(pamiec==1) { if(n[cyfra]==9) { n[cyfra]=0; cyfra--; } else { n[cyfra]++; pamiec=0; } } } else { n[n.size()-1]++; } } bool dopasuj (int i) { if(porownaj (t[i-1],t[i]) == 1) return 0; else { string m = t[i]; int ile=0; //cout<<porownaj (m, t[i-1])<<endl; while (porownaj (t[i-1], m)==0) { m+="9"; ile++; } wynik+=ile; for(int j=0; j<ile; j++) {t[i]+="0";} if(porownaj(t[i-1], t[i])==0) { n = t[i-1]; n.erase(0, n.size()-ile); dodaj(); t[i].erase((t[i].size()-ile), t[i].size()); t[i]+=n; } // cout<<i<<' '<<t[i]<<endl; return 0; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>N; for(int i=0; i<N; i++) cin>>t[i]; for(int i=1; i<N; i++) { dopasuj(i); //do poprzedniego //cout<<t[i]<<endl; } cout<<wynik; } |