#include <cstdio>
#include <cstring>
using namespace std;
int min(int a, int b){
if(a<b) return a;
else return b;
}
int main(){
int ile, dl, dl_poprz = 0, j, comp, dl2;
long long int licz = 0;
bool przel = false;
char str[35], poprz[35];
scanf("%d", &ile);
for(int i=0; i<ile; i++){
scanf("%s", str);
//printf("%s: ", str);
dl = strlen(str);
dl2 = strlen(poprz);
if(przel){
comp = strncmp(str, poprz, min(dl, dl2));
if(comp>=0){
licz += dl_poprz - dl;
//jezeli poprzedni poczatek jest dluzszy niz nowy poczatek, np. 291 --> 2
if(comp == 0 && dl2 > dl)
strcpy(str, poprz);
dl = dl_poprz;
}
else {
licz += dl_poprz - dl + 1;
dl = dl_poprz + 1;
}
}
else {
if(dl > dl_poprz){
//kolejna liczba ma wiecej cyfr wiec jest wieksza - ok
}
else if(dl == dl_poprz){
//kolejna liczba ma tyle samo cyfr, sprawdzam czy jest wieksza
comp = strcmp(str, poprz);
if(comp>0){
//jest wieksza - ok, nic nie robie
}
else if(comp<=0){
//jest mniejsza lub rowna - musze dodac 0 na koncu
licz+=1;
str[dl] = '0';
str[dl+1] = 0;
dl++;
}
}
else {
//kolejna liczba ma mniej cyfr od poprzedniej
//sprawdzam poczatek
comp = strncmp(str, poprz, dl);
if(comp>0){
//poczatek jest wiekszy - uzupelniam zerami
licz += dl_poprz - dl;
for(int q=dl; q<dl_poprz; q++) str[q] = '0';
dl = dl_poprz;
str[dl_poprz] = 0;
}
else if(comp<0){
//poczatek jest mniejszy - uzupelniam zerami az liczba bedzie dluzsza
licz += dl_poprz - dl + 1;
for(int q=dl; q<=dl_poprz; q++) str[q] = '0';
str[dl_poprz+1] = 0;
dl = dl_poprz + 1;
}
else {
//poczatek jest taki sam
//biore koncowke poprzedniej liczby i dodaje do niej jeden
licz += dl_poprz - dl;
for(j=dl_poprz-1;j>=dl;j--){
if(poprz[j] != '9') {
str[j] = poprz[j]+1;
for(int q=j+1; q<dl_poprz; q++) str[q] = '0';
for(int q=dl; q<j; q++) str[q] = poprz[q];
str[dl_poprz] = 0;
dl = dl_poprz;
break;
}
str[j] = poprz[j];
if(j == dl){
//dodaje zero na koncu
for(int q=j; q<=dl_poprz; q++) str[q] = '0';
str[dl_poprz+1] = 0;
dl = dl_poprz + 1;
licz++;
break;
}
}
}
}
}
dl_poprz = dl;
if(dl >= 30) przel = true;
strcpy(poprz, str);
}
printf("%lld", licz);
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 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 | #include <cstdio> #include <cstring> using namespace std; int min(int a, int b){ if(a<b) return a; else return b; } int main(){ int ile, dl, dl_poprz = 0, j, comp, dl2; long long int licz = 0; bool przel = false; char str[35], poprz[35]; scanf("%d", &ile); for(int i=0; i<ile; i++){ scanf("%s", str); //printf("%s: ", str); dl = strlen(str); dl2 = strlen(poprz); if(przel){ comp = strncmp(str, poprz, min(dl, dl2)); if(comp>=0){ licz += dl_poprz - dl; //jezeli poprzedni poczatek jest dluzszy niz nowy poczatek, np. 291 --> 2 if(comp == 0 && dl2 > dl) strcpy(str, poprz); dl = dl_poprz; } else { licz += dl_poprz - dl + 1; dl = dl_poprz + 1; } } else { if(dl > dl_poprz){ //kolejna liczba ma wiecej cyfr wiec jest wieksza - ok } else if(dl == dl_poprz){ //kolejna liczba ma tyle samo cyfr, sprawdzam czy jest wieksza comp = strcmp(str, poprz); if(comp>0){ //jest wieksza - ok, nic nie robie } else if(comp<=0){ //jest mniejsza lub rowna - musze dodac 0 na koncu licz+=1; str[dl] = '0'; str[dl+1] = 0; dl++; } } else { //kolejna liczba ma mniej cyfr od poprzedniej //sprawdzam poczatek comp = strncmp(str, poprz, dl); if(comp>0){ //poczatek jest wiekszy - uzupelniam zerami licz += dl_poprz - dl; for(int q=dl; q<dl_poprz; q++) str[q] = '0'; dl = dl_poprz; str[dl_poprz] = 0; } else if(comp<0){ //poczatek jest mniejszy - uzupelniam zerami az liczba bedzie dluzsza licz += dl_poprz - dl + 1; for(int q=dl; q<=dl_poprz; q++) str[q] = '0'; str[dl_poprz+1] = 0; dl = dl_poprz + 1; } else { //poczatek jest taki sam //biore koncowke poprzedniej liczby i dodaje do niej jeden licz += dl_poprz - dl; for(j=dl_poprz-1;j>=dl;j--){ if(poprz[j] != '9') { str[j] = poprz[j]+1; for(int q=j+1; q<dl_poprz; q++) str[q] = '0'; for(int q=dl; q<j; q++) str[q] = poprz[q]; str[dl_poprz] = 0; dl = dl_poprz; break; } str[j] = poprz[j]; if(j == dl){ //dodaje zero na koncu for(int q=j; q<=dl_poprz; q++) str[q] = '0'; str[dl_poprz+1] = 0; dl = dl_poprz + 1; licz++; break; } } } } } dl_poprz = dl; if(dl >= 30) przel = true; strcpy(poprz, str); } printf("%lld", licz); return 0; } |
English