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