#include <iostream> using namespace std; #define SIZE(c) static_cast<int>((c).size()) void inc(string& s) { for(int i=SIZE(s)-1;i>=0;--i) { if(s[i] < '9') { s[i]++; return; } s[i] = '0'; } } struct SWithPad { string pref; int sz; bool operator<(const SWithPad& oth) const { if(sz != oth.sz) return sz < oth.sz; if(SIZE(pref) == SIZE(oth.pref)) return pref < oth.pref; const int l = min(SIZE(pref), SIZE(oth.pref)); for(int i=0;i<l;++i) if(pref[i] != oth.pref[i]) return pref[i] < oth.pref[i]; return SIZE(pref) < SIZE(oth.pref); if(SIZE(pref) > SIZE(oth.pref)) return false; for(int i=l;i<SIZE(oth.pref);++i) if(oth.pref[i] != '0') return true; return false; } char operator[](int idx)const { return idx < SIZE(pref) ? pref[idx] : '0'; } void inc(){ pref.resize(sz, '0'); for(int i=sz-1;i>=0;--i) { if(pref[i] < '9') { pref[i]++; return; } pref[i] = '0'; } } int size()const{return sz;} }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); string last; int n; SWithPad lst; cin>>n>>lst.pref; lst.sz = SIZE(lst.pref); long long ans = 0; for(int _=1;_<n;++_) { SWithPad nxt; cin>>nxt.pref; nxt.sz = SIZE(nxt.pref); if(lst < nxt) { swap(nxt, lst); continue; } if(nxt.sz == lst.sz) { ++nxt.sz; ++ans; swap(nxt, lst); continue; } int i; for(i=0;i<SIZE(nxt);++i) if(nxt[i] != lst[i]) break; if(i < SIZE(nxt)) { if(nxt[i] > lst[i]) { ans += SIZE(lst) - SIZE(nxt); nxt.sz = lst.sz; swap(nxt, lst); continue; } ans += SIZE(lst) + 1 - SIZE(nxt); nxt.sz = lst.sz + 1; swap(nxt, lst); continue; } bool all9 = true; for(i=SIZE(nxt);i<SIZE(lst);++i) { if(lst[i] != '9'){ all9 = false; break; } } if(!all9) { ans += SIZE(lst) - SIZE(nxt); lst.inc(); } else { ans += SIZE(lst) + 1 - SIZE(nxt); nxt.sz = lst.sz + 1; swap(nxt, lst); } } cout << ans << endl; }
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 | #include <iostream> using namespace std; #define SIZE(c) static_cast<int>((c).size()) void inc(string& s) { for(int i=SIZE(s)-1;i>=0;--i) { if(s[i] < '9') { s[i]++; return; } s[i] = '0'; } } struct SWithPad { string pref; int sz; bool operator<(const SWithPad& oth) const { if(sz != oth.sz) return sz < oth.sz; if(SIZE(pref) == SIZE(oth.pref)) return pref < oth.pref; const int l = min(SIZE(pref), SIZE(oth.pref)); for(int i=0;i<l;++i) if(pref[i] != oth.pref[i]) return pref[i] < oth.pref[i]; return SIZE(pref) < SIZE(oth.pref); if(SIZE(pref) > SIZE(oth.pref)) return false; for(int i=l;i<SIZE(oth.pref);++i) if(oth.pref[i] != '0') return true; return false; } char operator[](int idx)const { return idx < SIZE(pref) ? pref[idx] : '0'; } void inc(){ pref.resize(sz, '0'); for(int i=sz-1;i>=0;--i) { if(pref[i] < '9') { pref[i]++; return; } pref[i] = '0'; } } int size()const{return sz;} }; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); string last; int n; SWithPad lst; cin>>n>>lst.pref; lst.sz = SIZE(lst.pref); long long ans = 0; for(int _=1;_<n;++_) { SWithPad nxt; cin>>nxt.pref; nxt.sz = SIZE(nxt.pref); if(lst < nxt) { swap(nxt, lst); continue; } if(nxt.sz == lst.sz) { ++nxt.sz; ++ans; swap(nxt, lst); continue; } int i; for(i=0;i<SIZE(nxt);++i) if(nxt[i] != lst[i]) break; if(i < SIZE(nxt)) { if(nxt[i] > lst[i]) { ans += SIZE(lst) - SIZE(nxt); nxt.sz = lst.sz; swap(nxt, lst); continue; } ans += SIZE(lst) + 1 - SIZE(nxt); nxt.sz = lst.sz + 1; swap(nxt, lst); continue; } bool all9 = true; for(i=SIZE(nxt);i<SIZE(lst);++i) { if(lst[i] != '9'){ all9 = false; break; } } if(!all9) { ans += SIZE(lst) - SIZE(nxt); lst.inc(); } else { ans += SIZE(lst) + 1 - SIZE(nxt); nxt.sz = lst.sz + 1; swap(nxt, lst); } } cout << ans << endl; } |