#include <iostream> #include <algorithm> #include <vector> #define DEBUG_MODE 0 #if DEBUG_MODE #include <cstdio> #define DEBUG(x...) printf(x); #else #define DEBUG(x...) #endif using namespace std; const int N = 24; const int M = 100; struct plecak { int a; int f; bool operator<(const plecak &p) const { return a > p.a; // odwrotny porzadek } }; template <class ForwardIterator, class T> ForwardIterator lessThanOrEqual(ForwardIterator first, ForwardIterator last, const T &val) { ForwardIterator it = upper_bound(first,last,val); if (it == first) return it; return it - 1; } int main(int argc, char ** argv) { cin.sync_with_stdio(false); int n, m; cin >> n >> m; vector<int> T(n); vector<plecak> R(m); for (int i = 0; i < n; cin >> T[i++]); for (int i = 0; i < m; cin >> R[i].a, R[i].f = R[i++].a); sort(T.begin(), T.end()); sort(R.begin(), R.end()); if ((*R.begin()).a < T.back()) { cout << "NIE\n"; return 0; } vector<int>::iterator itT = T.begin(); vector<plecak>::iterator itR = R.begin(); while (!T.empty()) { if ((*itR).f == 0 || (*itR).f < *(T.begin())) { ++itR; if (itR == R.end()) { cout << "NIE\n"; return 0; } } itT = lessThanOrEqual(T.begin(),T.end(),(*itR).f); if ((*itR).f >= (*itT)) { (*itR).f -= *itT; T.erase(itT); } else { cout << "NIE\n"; return 0; } } cout << itR - R.begin() + 1 << "\n"; 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 | #include <iostream> #include <algorithm> #include <vector> #define DEBUG_MODE 0 #if DEBUG_MODE #include <cstdio> #define DEBUG(x...) printf(x); #else #define DEBUG(x...) #endif using namespace std; const int N = 24; const int M = 100; struct plecak { int a; int f; bool operator<(const plecak &p) const { return a > p.a; // odwrotny porzadek } }; template <class ForwardIterator, class T> ForwardIterator lessThanOrEqual(ForwardIterator first, ForwardIterator last, const T &val) { ForwardIterator it = upper_bound(first,last,val); if (it == first) return it; return it - 1; } int main(int argc, char ** argv) { cin.sync_with_stdio(false); int n, m; cin >> n >> m; vector<int> T(n); vector<plecak> R(m); for (int i = 0; i < n; cin >> T[i++]); for (int i = 0; i < m; cin >> R[i].a, R[i].f = R[i++].a); sort(T.begin(), T.end()); sort(R.begin(), R.end()); if ((*R.begin()).a < T.back()) { cout << "NIE\n"; return 0; } vector<int>::iterator itT = T.begin(); vector<plecak>::iterator itR = R.begin(); while (!T.empty()) { if ((*itR).f == 0 || (*itR).f < *(T.begin())) { ++itR; if (itR == R.end()) { cout << "NIE\n"; return 0; } } itT = lessThanOrEqual(T.begin(),T.end(),(*itR).f); if ((*itR).f >= (*itT)) { (*itR).f -= *itT; T.erase(itT); } else { cout << "NIE\n"; return 0; } } cout << itR - R.begin() + 1 << "\n"; return 0; } |