#include <algorithm>
#include <cstdio>
#include <vector>
constexpr int najnizszy = -1'111'111;
constexpr int najwyzszy = 1'111'111;
struct wybor {
wybor(int w, int z): wartosc(w), zmian(z){}
int wartosc;
int zmian;
};
int main() {
std::vector<int> dzwieki;
int dlugosc;
scanf("%d", &dlugosc);
dzwieki.reserve(dlugosc);
for(int i=0; i<dlugosc; ++i) {
int dzwiek;
scanf("%d", &dzwiek);
dzwieki.push_back(dzwiek);
}
// załóżmy WNW...
std::vector<wybor> wybory;
wybory.emplace_back(dzwieki[0], 0);
wybory.emplace_back(najwyzszy, 1);
for (int i=1; i<dlugosc; ++i) {
std::vector<wybor> kolejne_wybory;
if (i & 1) { // niski
if (dzwieki[i] < wybory.front().wartosc) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian);
} else if (dzwieki[i] < wybory.back().wartosc) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian);
}
kolejne_wybory.emplace_back(najnizszy, wybory.front().zmian+1);
} else { // wysoki
if (wybory.front().wartosc < dzwieki[i]) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian);
}
else if (wybory.back().wartosc < dzwieki[i]) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian);
}
kolejne_wybory.emplace_back(najwyzszy, wybory.front().zmian+1);
}
if (kolejne_wybory.back().zmian < kolejne_wybory.front().zmian) {
std::swap(kolejne_wybory.front(), kolejne_wybory.back());
}
std::swap(wybory, kolejne_wybory);
}
int najmniej_zmian = wybory.front().zmian;
// załóżmy NWN...
wybory.clear();
wybory.emplace_back(dzwieki[0], 0);
wybory.emplace_back(najnizszy, 1);
for (int i=1; i<dlugosc; ++i) {
std::vector<wybor> kolejne_wybory;
if (i & 1) { // wysoki
if (wybory.front().wartosc < dzwieki[i]) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian);
}
else if (wybory.back().wartosc < dzwieki[i]) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian);
}
kolejne_wybory.emplace_back(najwyzszy, wybory.front().zmian+1);
} else { // niski
if (dzwieki[i] < wybory.front().wartosc) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian);
} else if (dzwieki[i] < wybory.back().wartosc) {
kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian);
}
kolejne_wybory.emplace_back(najnizszy, wybory.front().zmian+1);
}
if (kolejne_wybory.back().zmian < kolejne_wybory.front().zmian) {
std::swap(kolejne_wybory.front(), kolejne_wybory.back());
}
std::swap(wybory, kolejne_wybory);
}
najmniej_zmian = std::min(najmniej_zmian, wybory.front().zmian);
printf("%d\n", najmniej_zmian);
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 | #include <algorithm> #include <cstdio> #include <vector> constexpr int najnizszy = -1'111'111; constexpr int najwyzszy = 1'111'111; struct wybor { wybor(int w, int z): wartosc(w), zmian(z){} int wartosc; int zmian; }; int main() { std::vector<int> dzwieki; int dlugosc; scanf("%d", &dlugosc); dzwieki.reserve(dlugosc); for(int i=0; i<dlugosc; ++i) { int dzwiek; scanf("%d", &dzwiek); dzwieki.push_back(dzwiek); } // załóżmy WNW... std::vector<wybor> wybory; wybory.emplace_back(dzwieki[0], 0); wybory.emplace_back(najwyzszy, 1); for (int i=1; i<dlugosc; ++i) { std::vector<wybor> kolejne_wybory; if (i & 1) { // niski if (dzwieki[i] < wybory.front().wartosc) { kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian); } else if (dzwieki[i] < wybory.back().wartosc) { kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian); } kolejne_wybory.emplace_back(najnizszy, wybory.front().zmian+1); } else { // wysoki if (wybory.front().wartosc < dzwieki[i]) { kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian); } else if (wybory.back().wartosc < dzwieki[i]) { kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian); } kolejne_wybory.emplace_back(najwyzszy, wybory.front().zmian+1); } if (kolejne_wybory.back().zmian < kolejne_wybory.front().zmian) { std::swap(kolejne_wybory.front(), kolejne_wybory.back()); } std::swap(wybory, kolejne_wybory); } int najmniej_zmian = wybory.front().zmian; // załóżmy NWN... wybory.clear(); wybory.emplace_back(dzwieki[0], 0); wybory.emplace_back(najnizszy, 1); for (int i=1; i<dlugosc; ++i) { std::vector<wybor> kolejne_wybory; if (i & 1) { // wysoki if (wybory.front().wartosc < dzwieki[i]) { kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian); } else if (wybory.back().wartosc < dzwieki[i]) { kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian); } kolejne_wybory.emplace_back(najwyzszy, wybory.front().zmian+1); } else { // niski if (dzwieki[i] < wybory.front().wartosc) { kolejne_wybory.emplace_back(dzwieki[i], wybory.front().zmian); } else if (dzwieki[i] < wybory.back().wartosc) { kolejne_wybory.emplace_back(dzwieki[i], wybory.back().zmian); } kolejne_wybory.emplace_back(najnizszy, wybory.front().zmian+1); } if (kolejne_wybory.back().zmian < kolejne_wybory.front().zmian) { std::swap(kolejne_wybory.front(), kolejne_wybory.back()); } std::swap(wybory, kolejne_wybory); } najmniej_zmian = std::min(najmniej_zmian, wybory.front().zmian); printf("%d\n", najmniej_zmian); return 0; } |
English