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