#include <cstdio> #include <vector> #include <algorithm> #include <functional> #include <set> using namespace std; const int N_MAX = 24; const int M_MAX = 100; int przedmiot[N_MAX]; // masa przedmiotu int plecak[M_MAX]; // wytrzymalosc plecaka bool zapakuj(int K, int n) { set< pair<int, int> > s; for (int i = 0; i < K; ++i) { s.insert(make_pair(plecak[i], i)); } for (int i = 0; i < n; ++i) { set< pair<int, int> >::iterator it; it = s.upper_bound(make_pair(przedmiot[i], i)); if (it == s.end()) return false; pair<int, int> act = *it; s.erase(it); if (act.first-przedmiot[i] > 0) s.insert(make_pair(act.first-przedmiot[i], act.second)); } /* vector<int> Kopiec(plecak, plecak + K); make_heap(Kopiec.begin(), Kopiec.end()); for (int i = 0; i < n; ++i) { int t = Kopiec.front(); // Zwraca najwiekszy plecak if (t < przedmiot[i]) { return false; } pop_heap(Kopiec.begin(), Kopiec.end()); Kopiec.pop_back(); Kopiec.push_back(t - przedmiot[i]); push_heap(Kopiec.begin(), Kopiec.end()); }*/ return true; } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d", &przedmiot[i]); } for (int i = 0; i < m; ++i) { scanf("%d", &plecak[i]); } sort(przedmiot, przedmiot +n, greater<int>()); sort(plecak, plecak + m, greater<int>()); // wyszukiwanie binarne int l = 0; int p = m; bool result = false; while (l+1 < p) { int srodek = (l + p) / 2; if (zapakuj(srodek, n)) { p = srodek; result = true; } else l = srodek; } if (result) printf("%d\n", l+1); else printf("NIE\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 | #include <cstdio> #include <vector> #include <algorithm> #include <functional> #include <set> using namespace std; const int N_MAX = 24; const int M_MAX = 100; int przedmiot[N_MAX]; // masa przedmiotu int plecak[M_MAX]; // wytrzymalosc plecaka bool zapakuj(int K, int n) { set< pair<int, int> > s; for (int i = 0; i < K; ++i) { s.insert(make_pair(plecak[i], i)); } for (int i = 0; i < n; ++i) { set< pair<int, int> >::iterator it; it = s.upper_bound(make_pair(przedmiot[i], i)); if (it == s.end()) return false; pair<int, int> act = *it; s.erase(it); if (act.first-przedmiot[i] > 0) s.insert(make_pair(act.first-przedmiot[i], act.second)); } /* vector<int> Kopiec(plecak, plecak + K); make_heap(Kopiec.begin(), Kopiec.end()); for (int i = 0; i < n; ++i) { int t = Kopiec.front(); // Zwraca najwiekszy plecak if (t < przedmiot[i]) { return false; } pop_heap(Kopiec.begin(), Kopiec.end()); Kopiec.pop_back(); Kopiec.push_back(t - przedmiot[i]); push_heap(Kopiec.begin(), Kopiec.end()); }*/ return true; } int main() { int n, m; scanf("%d %d", &n, &m); for (int i = 0; i < n; ++i) { scanf("%d", &przedmiot[i]); } for (int i = 0; i < m; ++i) { scanf("%d", &plecak[i]); } sort(przedmiot, przedmiot +n, greater<int>()); sort(plecak, plecak + m, greater<int>()); // wyszukiwanie binarne int l = 0; int p = m; bool result = false; while (l+1 < p) { int srodek = (l + p) / 2; if (zapakuj(srodek, n)) { p = srodek; result = true; } else l = srodek; } if (result) printf("%d\n", l+1); else printf("NIE\n"); return 0; } |