//Piotr Kłpotowski
#include <iostream>
#include <string>
using namespace std;
long long writeBack(long long, int);
int degree(long long);
long long subInt(long long, int, int);
bool expandable(long long);
int n;
int changesCount = 0;
int main() {
cin >> n;
int a[n];
long long prev = 0;
for(int i = 0; i < n; i++){
cin >> a[i];
}
for(int i = 0; i < n; i++){
long long c = a[i];
if(c <= prev) {
int degreeC = degree(c);
int degreePrev = degree(prev);
int degreeDiff = degreePrev-degreeC;
if(degreeDiff == 0) {
prev = writeBack(c, 0);
changesCount++;
continue;
}
else if(degreeDiff > 0){
//Compare bases
long long basePrev = subInt(prev, 1, degreeC);
if(basePrev == c){
//Take the rest
long long rest = subInt(prev, degreeC + 1, degreeDiff);
if(expandable(rest)){
c = writeBack(c, rest+1);
changesCount += degreeDiff;
} else {
for(int j = degreeDiff; j <= degreePrev; j++){
c = writeBack(c, 0);
changesCount++;
}
}
prev = c;
continue;
}
else if(basePrev > c){
for(int j = degreeDiff; j <= degreePrev; j++){
c = writeBack(c, 0);
changesCount++;
}
prev = c;
continue;
}
else { // c > basePrev
for(int j = degreeDiff; j < degreePrev; j++){
c = writeBack(c, 0);
changesCount++;
}
prev = c;
continue;
}
}
} else prev = c;
}
cout << changesCount;
return 0;
}
long long writeBack(long long a, int b){
return stoll(to_string(a) + to_string(b));
}
int degree(long long i){
return to_string(i).length();
}
long long subInt(long long a, int start, int length){
string s = to_string(a);
return stoll(s.substr(start+1, length));
}
bool expandable(long long i){
return to_string(i+1).size() == to_string(i).size();
}
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 | //Piotr Kłpotowski #include <iostream> #include <string> using namespace std; long long writeBack(long long, int); int degree(long long); long long subInt(long long, int, int); bool expandable(long long); int n; int changesCount = 0; int main() { cin >> n; int a[n]; long long prev = 0; for(int i = 0; i < n; i++){ cin >> a[i]; } for(int i = 0; i < n; i++){ long long c = a[i]; if(c <= prev) { int degreeC = degree(c); int degreePrev = degree(prev); int degreeDiff = degreePrev-degreeC; if(degreeDiff == 0) { prev = writeBack(c, 0); changesCount++; continue; } else if(degreeDiff > 0){ //Compare bases long long basePrev = subInt(prev, 1, degreeC); if(basePrev == c){ //Take the rest long long rest = subInt(prev, degreeC + 1, degreeDiff); if(expandable(rest)){ c = writeBack(c, rest+1); changesCount += degreeDiff; } else { for(int j = degreeDiff; j <= degreePrev; j++){ c = writeBack(c, 0); changesCount++; } } prev = c; continue; } else if(basePrev > c){ for(int j = degreeDiff; j <= degreePrev; j++){ c = writeBack(c, 0); changesCount++; } prev = c; continue; } else { // c > basePrev for(int j = degreeDiff; j < degreePrev; j++){ c = writeBack(c, 0); changesCount++; } prev = c; continue; } } } else prev = c; } cout << changesCount; return 0; } long long writeBack(long long a, int b){ return stoll(to_string(a) + to_string(b)); } int degree(long long i){ return to_string(i).length(); } long long subInt(long long a, int start, int length){ string s = to_string(a); return stoll(s.substr(start+1, length)); } bool expandable(long long i){ return to_string(i+1).size() == to_string(i).size(); } |
English