#include <stdio.h>
#include <vector>
#include <algorithm>
#define N 17
void digits(long long int a, std::vector<int> & ret){
while (a > 0) {
ret.push_back(a % 10);
a/=10;
}
std::reverse(ret.begin(),ret.end());
}
int biggerOrEq(std::vector<int> & prev, std::vector<int> & next){
if (prev.size() > next.size()) return 1;
if (prev.size() < next.size()) return 0;
for(int i = 0; i < (int) prev.size(); ++i){
if (prev[i] < next[i]) return 0;
if (prev[i] > next[i]) return 1;
}
return 1;
}
int upgradeNumber(std::vector<int> & prev, std::vector<int> & next, long long int & total){
//next jest mniejszy
for(int i = 0; i < (int) next.size(); ++i){
if (prev[i] < next[i]){//uzupelniamy zerami
// printf("++++++++++++++=\n");
int toAdd = ((int) prev.size() - (int)next.size());
for(int j = 0; j < toAdd; ++j) {
next.push_back(0);
++total;
}
return 0;
}
if (prev[i] > next[i]){//jestesmy mniejsi wiec musimy dodac cyfre i uzupelniamy sie zerami ale o jedno wiecej
int toAdd = ((int) prev.size() - (int)next.size()) + 1;
// printf("****************\n");
for(int j = 0; j < toAdd ; ++j) {
next.push_back(0);
++total;
}
if (next.size() > N){
next.pop_back();
--total;
return 1;
}
return 0;
}
}
//tutaj wystarczy ze podbijemy poprzednia o jeden i mozemy podbic bo przynajmenij jedna z cyfr ktora moze byc dodana nie jest 9tka
// printf("--------------------\n");
for(int i = (int)prev.size() - 1; i >= (int)next.size(); --i){
if (prev[i] < 9) {
int toAdd = ((int) prev.size() - (int)next.size());
next = prev;
next.back() += 1;
int j = next.size() - 1;
while(j >= 0 && next[j] > 9){
next[j] -= 10;
next[j-1] += 1;
--j;
}
total += toAdd;//dodajemy roznice
return 0;
}
}
// printf("=========================\n");
//przypadek brzegowy sa same 9tki wiec trzeba podbic liczbe cyfr
int toAdd = ((int) prev.size() - (int)next.size()) + 1;
total += toAdd;
for(int j = 0; j < toAdd; ++j) {
next.push_back(0);
}
int addedZeros = 0;
while(next.size() > N){
++addedZeros;
next.pop_back();
}
return addedZeros;
}
void print(std::vector<int> & prev){
for(int i = 0; i < (int) prev.size(); ++i) printf("%d",prev[i]);
printf(" ");
}
int main(){
int n;
long long int total = 0;
long long int zeros = 0;
long long int a;
std::vector<int> lastNumber;
std::vector<int> nextNumber;
scanf("%d",&n);
for(int i = 0; i < n; ++i){
scanf("%lld",&a);
digits(a,nextNumber);
if (biggerOrEq(lastNumber,nextNumber)){
zeros += upgradeNumber(lastNumber,nextNumber,total);
total += zeros;
} else {
total += zeros;
}
// print(nextNumber);printf("\n");
lastNumber = nextNumber;
nextNumber.clear();
// print(lastNumber);
// printf("%lld\n",zeros);
}
printf("%lld\n",total);
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 107 108 109 110 111 112 113 114 115 116 117 118 | #include <stdio.h> #include <vector> #include <algorithm> #define N 17 void digits(long long int a, std::vector<int> & ret){ while (a > 0) { ret.push_back(a % 10); a/=10; } std::reverse(ret.begin(),ret.end()); } int biggerOrEq(std::vector<int> & prev, std::vector<int> & next){ if (prev.size() > next.size()) return 1; if (prev.size() < next.size()) return 0; for(int i = 0; i < (int) prev.size(); ++i){ if (prev[i] < next[i]) return 0; if (prev[i] > next[i]) return 1; } return 1; } int upgradeNumber(std::vector<int> & prev, std::vector<int> & next, long long int & total){ //next jest mniejszy for(int i = 0; i < (int) next.size(); ++i){ if (prev[i] < next[i]){//uzupelniamy zerami // printf("++++++++++++++=\n"); int toAdd = ((int) prev.size() - (int)next.size()); for(int j = 0; j < toAdd; ++j) { next.push_back(0); ++total; } return 0; } if (prev[i] > next[i]){//jestesmy mniejsi wiec musimy dodac cyfre i uzupelniamy sie zerami ale o jedno wiecej int toAdd = ((int) prev.size() - (int)next.size()) + 1; // printf("****************\n"); for(int j = 0; j < toAdd ; ++j) { next.push_back(0); ++total; } if (next.size() > N){ next.pop_back(); --total; return 1; } return 0; } } //tutaj wystarczy ze podbijemy poprzednia o jeden i mozemy podbic bo przynajmenij jedna z cyfr ktora moze byc dodana nie jest 9tka // printf("--------------------\n"); for(int i = (int)prev.size() - 1; i >= (int)next.size(); --i){ if (prev[i] < 9) { int toAdd = ((int) prev.size() - (int)next.size()); next = prev; next.back() += 1; int j = next.size() - 1; while(j >= 0 && next[j] > 9){ next[j] -= 10; next[j-1] += 1; --j; } total += toAdd;//dodajemy roznice return 0; } } // printf("=========================\n"); //przypadek brzegowy sa same 9tki wiec trzeba podbic liczbe cyfr int toAdd = ((int) prev.size() - (int)next.size()) + 1; total += toAdd; for(int j = 0; j < toAdd; ++j) { next.push_back(0); } int addedZeros = 0; while(next.size() > N){ ++addedZeros; next.pop_back(); } return addedZeros; } void print(std::vector<int> & prev){ for(int i = 0; i < (int) prev.size(); ++i) printf("%d",prev[i]); printf(" "); } int main(){ int n; long long int total = 0; long long int zeros = 0; long long int a; std::vector<int> lastNumber; std::vector<int> nextNumber; scanf("%d",&n); for(int i = 0; i < n; ++i){ scanf("%lld",&a); digits(a,nextNumber); if (biggerOrEq(lastNumber,nextNumber)){ zeros += upgradeNumber(lastNumber,nextNumber,total); total += zeros; } else { total += zeros; } // print(nextNumber);printf("\n"); lastNumber = nextNumber; nextNumber.clear(); // print(lastNumber); // printf("%lld\n",zeros); } printf("%lld\n",total); return 0; } |
English