#include <cassert> #include <string> #include <iostream> using namespace std; long long powieksz( string& poprzedni, string const& aktualny ) { int len_diff = poprzedni.size() - aktualny.size(); if( len_diff < 0 ) { poprzedni = aktualny; return 0; } //assert( poprzedni.size() >= aktualny.size() ); string poprz_prefix = poprzedni.substr( 0, aktualny.size() ); //assert( poprz_prefix.size() == aktualny.size() ); if( poprz_prefix < aktualny ) { // dopisz zera do aktualnego, zwroc liczbe dopisanych zer poprzedni = aktualny + string( len_diff, '0' ); return len_diff; } if( poprz_prefix > aktualny ) { // prefix jest wiekszy, mozemy pokonac tylko dlugoscia poprzedni = aktualny + string( 1 + len_diff, '0' ); return 1 + len_diff; } //assert( poprz_prefix == aktualny ); long long i_kon = poprzedni.size(); long long i_pocz = poprz_prefix.size(); for( long long i = i_kon - 1; i >= i_pocz; --i ) { char cyfra = poprzedni[i]; //assert( (cyfra >= '0') && (cyfra <= '9') ); if( cyfra != '9' ) { poprzedni[i] = cyfra + 1; for( int j = i + 1; j < poprzedni.size(); ++i ) { poprzedni[j] = '0'; } return len_diff; } } // nie znalazlem nie-9 poprzedni = poprz_prefix + string( 1 + len_diff, '0' ); return 1 + len_diff; } int main() { int ile; cin >> ile; long long wynik = 0; string poprzedni = "0"; for ( int i = 0; i < ile; ++i ) { string aktualny; cin >> aktualny; //perr << setw(5) << poprzedni << " " << setw(10) << right << aktualny; long long delta = powieksz( poprzedni, aktualny ); wynik += delta; //perr << "+" << setw(9) << left <<delta << " " << setw(10) << right << poprzedni; } cout << wynik << "\n"; 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 | #include <cassert> #include <string> #include <iostream> using namespace std; long long powieksz( string& poprzedni, string const& aktualny ) { int len_diff = poprzedni.size() - aktualny.size(); if( len_diff < 0 ) { poprzedni = aktualny; return 0; } //assert( poprzedni.size() >= aktualny.size() ); string poprz_prefix = poprzedni.substr( 0, aktualny.size() ); //assert( poprz_prefix.size() == aktualny.size() ); if( poprz_prefix < aktualny ) { // dopisz zera do aktualnego, zwroc liczbe dopisanych zer poprzedni = aktualny + string( len_diff, '0' ); return len_diff; } if( poprz_prefix > aktualny ) { // prefix jest wiekszy, mozemy pokonac tylko dlugoscia poprzedni = aktualny + string( 1 + len_diff, '0' ); return 1 + len_diff; } //assert( poprz_prefix == aktualny ); long long i_kon = poprzedni.size(); long long i_pocz = poprz_prefix.size(); for( long long i = i_kon - 1; i >= i_pocz; --i ) { char cyfra = poprzedni[i]; //assert( (cyfra >= '0') && (cyfra <= '9') ); if( cyfra != '9' ) { poprzedni[i] = cyfra + 1; for( int j = i + 1; j < poprzedni.size(); ++i ) { poprzedni[j] = '0'; } return len_diff; } } // nie znalazlem nie-9 poprzedni = poprz_prefix + string( 1 + len_diff, '0' ); return 1 + len_diff; } int main() { int ile; cin >> ile; long long wynik = 0; string poprzedni = "0"; for ( int i = 0; i < ile; ++i ) { string aktualny; cin >> aktualny; //perr << setw(5) << poprzedni << " " << setw(10) << right << aktualny; long long delta = powieksz( poprzedni, aktualny ); wynik += delta; //perr << "+" << setw(9) << left <<delta << " " << setw(10) << right << poprzedni; } cout << wynik << "\n"; return 0; } |