#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; } |
English