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