#include <iostream> #include <stdio.h> #include <vector> #include <math.h> using namespace std; int main() { vector<int> powers; int iterations; int currentNum; int currentBest = 0; scanf("%u", &iterations); for(int i = 0; i < iterations; ++i) { if(i == iterations - 1) scanf("%u", ¤tNum); else scanf("%u ", ¤tNum); bool contains = false; bool breakOnNext = false; int lowerLimit = 0; int upperLimit = powers.size(); int currentIndex = (lowerLimit + upperLimit) / 2; if(currentBest >= currentNum) { while(!(lowerLimit >= upperLimit)) { do { if(powers[currentIndex] == currentNum) { contains = true; powers[currentIndex] = ++currentNum; if(powers[currentIndex] >= currentBest) currentBest = powers[currentIndex]; currentIndex++; breakOnNext = true; } else if(breakOnNext) break; else { if(powers[currentIndex] < currentNum) lowerLimit = ceil((float)(lowerLimit + upperLimit)/2); else upperLimit = (lowerLimit + upperLimit)/2; currentIndex = (lowerLimit + upperLimit) / 2; } } while(breakOnNext); if(breakOnNext) break; } } else currentIndex = powers.size(); if(!contains) { powers.insert(powers.begin() + currentIndex, currentNum); if(currentBest < currentNum) currentBest = currentNum; } } cout << currentBest << endl; 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 | #include <iostream> #include <stdio.h> #include <vector> #include <math.h> using namespace std; int main() { vector<int> powers; int iterations; int currentNum; int currentBest = 0; scanf("%u", &iterations); for(int i = 0; i < iterations; ++i) { if(i == iterations - 1) scanf("%u", ¤tNum); else scanf("%u ", ¤tNum); bool contains = false; bool breakOnNext = false; int lowerLimit = 0; int upperLimit = powers.size(); int currentIndex = (lowerLimit + upperLimit) / 2; if(currentBest >= currentNum) { while(!(lowerLimit >= upperLimit)) { do { if(powers[currentIndex] == currentNum) { contains = true; powers[currentIndex] = ++currentNum; if(powers[currentIndex] >= currentBest) currentBest = powers[currentIndex]; currentIndex++; breakOnNext = true; } else if(breakOnNext) break; else { if(powers[currentIndex] < currentNum) lowerLimit = ceil((float)(lowerLimit + upperLimit)/2); else upperLimit = (lowerLimit + upperLimit)/2; currentIndex = (lowerLimit + upperLimit) / 2; } } while(breakOnNext); if(breakOnNext) break; } } else currentIndex = powers.size(); if(!contains) { powers.insert(powers.begin() + currentIndex, currentNum); if(currentBest < currentNum) currentBest = currentNum; } } cout << currentBest << endl; return 0; } |