/** Potyczki Algorytmiczne 2018 - 2 B - Nowy Kontrakt */
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int MaxLen = 10000000;
int numLines, orgLen1, orgLen2, finLen1, finLen2;
unsigned long long newDigits = 0;
char buff1[MaxLen], buff2[MaxLen], *ptr1, *ptr2;
unsigned long long majorize() {
unsigned long long result = 0;
if(orgLen2>finLen1) {
return 0;
}
if(orgLen2<finLen1) {
for(int i=orgLen2;i<finLen1;++i)
ptr2[i] = '0';
ptr2[finLen1] = '\0';
finLen2 = finLen1;
result += finLen2-orgLen2;
}
int pos = 0;
for(;ptr1[pos]==ptr2[pos] && pos<finLen2;++pos);
if(pos==finLen2) {
if(orgLen2==finLen2) {
ptr2[finLen2++] = '0';
ptr2[finLen2] = '\0';
return result+1;
}
ptr2[finLen2-1] = '1';
return result;
}
if(pos<orgLen2) {
if(ptr2[pos]>ptr1[pos]) {
return result;
}
ptr2[finLen2++] = '0';
ptr2[finLen2] = '\0';
return result+1;
}
if(ptr1[pos]<'9') {
ptr2[pos] = ptr1[pos]+1;
return result;
}
if(pos>orgLen2) {
ptr2[pos-1] = '1';
return result;
}
ptr2[finLen2++] = '0';
ptr2[finLen2] = '\0';
return result+1;
}
int main(void) {
fgets(buff1,MaxLen,stdin);
numLines = strtol(buff1,NULL,10);
fgets(buff1,MaxLen,stdin);
orgLen1 = finLen1 = strlen(buff1)-1;
buff1[orgLen1] = '\0';
ptr1 = buff1;
ptr2 = buff2;
for(int i=1;i<numLines;++i) {
fgets(ptr2,MaxLen,stdin);
finLen2 = orgLen2 = strlen(ptr2)-1;
ptr2[orgLen2] = '\0';
newDigits += majorize();
swap(ptr1,ptr2);
swap(orgLen1,orgLen2);
swap(finLen1,finLen2);
}
printf("%llu\n",newDigits);
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 | /** Potyczki Algorytmiczne 2018 - 2 B - Nowy Kontrakt */ #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> using namespace std; const int MaxLen = 10000000; int numLines, orgLen1, orgLen2, finLen1, finLen2; unsigned long long newDigits = 0; char buff1[MaxLen], buff2[MaxLen], *ptr1, *ptr2; unsigned long long majorize() { unsigned long long result = 0; if(orgLen2>finLen1) { return 0; } if(orgLen2<finLen1) { for(int i=orgLen2;i<finLen1;++i) ptr2[i] = '0'; ptr2[finLen1] = '\0'; finLen2 = finLen1; result += finLen2-orgLen2; } int pos = 0; for(;ptr1[pos]==ptr2[pos] && pos<finLen2;++pos); if(pos==finLen2) { if(orgLen2==finLen2) { ptr2[finLen2++] = '0'; ptr2[finLen2] = '\0'; return result+1; } ptr2[finLen2-1] = '1'; return result; } if(pos<orgLen2) { if(ptr2[pos]>ptr1[pos]) { return result; } ptr2[finLen2++] = '0'; ptr2[finLen2] = '\0'; return result+1; } if(ptr1[pos]<'9') { ptr2[pos] = ptr1[pos]+1; return result; } if(pos>orgLen2) { ptr2[pos-1] = '1'; return result; } ptr2[finLen2++] = '0'; ptr2[finLen2] = '\0'; return result+1; } int main(void) { fgets(buff1,MaxLen,stdin); numLines = strtol(buff1,NULL,10); fgets(buff1,MaxLen,stdin); orgLen1 = finLen1 = strlen(buff1)-1; buff1[orgLen1] = '\0'; ptr1 = buff1; ptr2 = buff2; for(int i=1;i<numLines;++i) { fgets(ptr2,MaxLen,stdin); finLen2 = orgLen2 = strlen(ptr2)-1; ptr2[orgLen2] = '\0'; newDigits += majorize(); swap(ptr1,ptr2); swap(orgLen1,orgLen2); swap(finLen1,finLen2); } printf("%llu\n",newDigits); return 0; } |
English