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