#include <bits/stdc++.h> using namespace std; bool czy_mniejszy(string &s1, string &s2) { if (s1.size() > s2.size()) return false; for (int i = 0; i < min(s1.size(), s2.size()); i++) { if (s1[i] < s2[i]) return true; if (s1[i] > s2[i]) return false; } return false; } bool czy_wiekszy(string &s1, string &s2) { for (int i = 0; i < min(s1.size(), s2.size()); i++) { if (s2[i] > s1[i]) return true; if (s2[i] < s1[i]) return false; } return false; } bool czy_prefiks(string &s1, string &s2) { for (int i = 0; i < s1.size(); i++) if (s1[i] != s2[i]) return false; return true; } int zmien(string &akt, string &pop) { int wynik = 0, i; if (akt.size() > pop.size()) return wynik; if (czy_mniejszy(akt, pop)) { int stala = pop.size() - akt.size() + 1; for (i = 0; i < stala; i++) { akt += "0"; wynik++; } return wynik; } if (!czy_prefiks(akt, pop)) { if (akt.size() == pop.size()) return wynik; int stala = pop.size() - akt.size(); for (i = 0; i < stala; i++) { akt += "0"; wynik++; } return wynik; } for (i = (int)pop.size() - 1; i >= (int)akt.size(); i--) if (pop[i] != '9') break; if (i == (int)akt.size() - 1) { int stala = pop.size() - akt.size() + 1; for (i = 0; i < stala; i++) { akt += "0"; wynik++; } return wynik; } for (int j = (int)akt.size(); j < i; j++) { akt += pop[j]; wynik++; } akt += (char)((int)pop[i] + 1); wynik++; for (int j = i + 1; j < (int)pop.size(); j++) { akt += "0"; wynik++; } return wynik; } int main() { int n, rozmiar_pop = -1; long long wynik = 0; string akt, pop = "-1"; cin >> n; for (int i = 0; i < n; i++) { cin >> akt; if (pop != "-1") { if (rozmiar_pop >= 100) { if (czy_wiekszy(akt, pop)) { wynik += (long long)(++rozmiar_pop - akt.size()); pop = akt; } else { wynik += (long long)(rozmiar_pop - akt.size()); if (pop.size() < akt.size() || !czy_prefiks(akt, pop)) pop = akt; } } else { wynik += (long long)zmien(akt, pop); pop = akt; rozmiar_pop = max((int)pop.size(), rozmiar_pop); } } else { pop = akt; rozmiar_pop = max((int)pop.size(), rozmiar_pop); } } cout << wynik << "\n"; }
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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <bits/stdc++.h> using namespace std; bool czy_mniejszy(string &s1, string &s2) { if (s1.size() > s2.size()) return false; for (int i = 0; i < min(s1.size(), s2.size()); i++) { if (s1[i] < s2[i]) return true; if (s1[i] > s2[i]) return false; } return false; } bool czy_wiekszy(string &s1, string &s2) { for (int i = 0; i < min(s1.size(), s2.size()); i++) { if (s2[i] > s1[i]) return true; if (s2[i] < s1[i]) return false; } return false; } bool czy_prefiks(string &s1, string &s2) { for (int i = 0; i < s1.size(); i++) if (s1[i] != s2[i]) return false; return true; } int zmien(string &akt, string &pop) { int wynik = 0, i; if (akt.size() > pop.size()) return wynik; if (czy_mniejszy(akt, pop)) { int stala = pop.size() - akt.size() + 1; for (i = 0; i < stala; i++) { akt += "0"; wynik++; } return wynik; } if (!czy_prefiks(akt, pop)) { if (akt.size() == pop.size()) return wynik; int stala = pop.size() - akt.size(); for (i = 0; i < stala; i++) { akt += "0"; wynik++; } return wynik; } for (i = (int)pop.size() - 1; i >= (int)akt.size(); i--) if (pop[i] != '9') break; if (i == (int)akt.size() - 1) { int stala = pop.size() - akt.size() + 1; for (i = 0; i < stala; i++) { akt += "0"; wynik++; } return wynik; } for (int j = (int)akt.size(); j < i; j++) { akt += pop[j]; wynik++; } akt += (char)((int)pop[i] + 1); wynik++; for (int j = i + 1; j < (int)pop.size(); j++) { akt += "0"; wynik++; } return wynik; } int main() { int n, rozmiar_pop = -1; long long wynik = 0; string akt, pop = "-1"; cin >> n; for (int i = 0; i < n; i++) { cin >> akt; if (pop != "-1") { if (rozmiar_pop >= 100) { if (czy_wiekszy(akt, pop)) { wynik += (long long)(++rozmiar_pop - akt.size()); pop = akt; } else { wynik += (long long)(rozmiar_pop - akt.size()); if (pop.size() < akt.size() || !czy_prefiks(akt, pop)) pop = akt; } } else { wynik += (long long)zmien(akt, pop); pop = akt; rozmiar_pop = max((int)pop.size(), rozmiar_pop); } } else { pop = akt; rozmiar_pop = max((int)pop.size(), rozmiar_pop); } } cout << wynik << "\n"; } |