#include <iostream> #include <set> constexpr int ATAK = 1; constexpr int WPLYW = 2; constexpr int ODPLYW = 3; int atak_szczupaka(std::multiset<long long> &staw, long long ma, long long chce) { std::multiset<long long> brzuch; while (ma < chce && !staw.empty()) { auto szprotka = staw.lower_bound(ma); if (szprotka == staw.begin()) { staw.merge(brzuch); return -1; } --szprotka; ma += *szprotka; brzuch.insert(*szprotka); staw.erase(szprotka); } if (ma < chce) { staw.swap(brzuch); return -1; } int wynik = brzuch.size(); staw.merge(brzuch); return wynik; } int main() { int szprotek; long long szprotka; std::multiset<long long> staw; std::cin >> szprotek; for (int i = 0; i < szprotek; ++i) { std::cin >> szprotka; staw.insert(szprotka); } int zdarzen; long long waga; long long docelowa_waga; int zjedzonych; int zdarzenie; std::cin >> zdarzen; for (int i = 0; i < zdarzen; ++i) { std::cin >> zdarzenie; std::cin >> waga; switch(zdarzenie) { break; case ATAK: std::cin >> docelowa_waga; zjedzonych = atak_szczupaka(staw, waga, docelowa_waga); std::cout << zjedzonych << '\n'; break; case WPLYW: staw.insert(waga); break; case ODPLYW: staw.erase(staw.find(waga)); } } }
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 | #include <iostream> #include <set> constexpr int ATAK = 1; constexpr int WPLYW = 2; constexpr int ODPLYW = 3; int atak_szczupaka(std::multiset<long long> &staw, long long ma, long long chce) { std::multiset<long long> brzuch; while (ma < chce && !staw.empty()) { auto szprotka = staw.lower_bound(ma); if (szprotka == staw.begin()) { staw.merge(brzuch); return -1; } --szprotka; ma += *szprotka; brzuch.insert(*szprotka); staw.erase(szprotka); } if (ma < chce) { staw.swap(brzuch); return -1; } int wynik = brzuch.size(); staw.merge(brzuch); return wynik; } int main() { int szprotek; long long szprotka; std::multiset<long long> staw; std::cin >> szprotek; for (int i = 0; i < szprotek; ++i) { std::cin >> szprotka; staw.insert(szprotka); } int zdarzen; long long waga; long long docelowa_waga; int zjedzonych; int zdarzenie; std::cin >> zdarzen; for (int i = 0; i < zdarzen; ++i) { std::cin >> zdarzenie; std::cin >> waga; switch(zdarzenie) { break; case ATAK: std::cin >> docelowa_waga; zjedzonych = atak_szczupaka(staw, waga, docelowa_waga); std::cout << zjedzonych << '\n'; break; case WPLYW: staw.insert(waga); break; case ODPLYW: staw.erase(staw.find(waga)); } } } |