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