#include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int main(int argc, char *argv[]) { bool debug = false; if (argc > 1) { debug = true; cout << "tryb debugowania" << endl; } int ileprzed = 0, ileplec = 0; scanf("%d %d", &ileprzed, &ileplec); if (debug == true) cout << "mamy " << ileprzed << " przedmiotów oraz " << ileplec << " plecaków" << endl; int tab[ileprzed]; int plecaki[ileplec]; for (int i = 0; i < ileprzed; i++) scanf("%d", &tab[i]); for (int i = 0; i < ileplec; i++) { scanf("%d", &plecaki[i]); } sort(tab, tab + ileprzed); reverse(tab, tab + ileprzed); sort(plecaki, plecaki + ileplec); reverse(plecaki, plecaki + ileplec); if (debug == true) { cout << "przedmioty: "; for (int i=0;i < ileprzed; i++) cout << tab[i] << " "; cout << endl; cout << "plecaki: "; for (int i=0;i < ileplec; i++) cout << plecaki[i] << " "; cout << endl; } if (tab[0] > plecaki[0]) puts("NIE"); else { int pocz = 0, kon = ileprzed - 1, wynik = 0, ktory = 0; while (pocz <= kon) { int pojem = plecaki[ktory]; if (debug == true) cout << "bierzemy plecak o pojemnosci " << pojem << endl; ktory ++; if (ktory == ileplec && tab[pocz] > plecaki[ktory]) { puts("NIE"); return 0; } int wplecaku = 0; bool dokladamy = true; while (dokladamy == true) { dokladamy = false; wplecaku += tab[pocz]; if (wplecaku < pojem && pocz<= kon) { if (debug == true) { cout << "z dużych dokladamy" << tab[pocz] << endl; } pocz++; dokladamy = true; } } if (wplecaku > pojem) { wplecaku = wplecaku - tab[pocz]; } dokladamy = true; while (dokladamy == true) { dokladamy = false; wplecaku += tab[kon]; if (wplecaku <= pojem && pocz <= kon) { if (wplecaku < pojem) { if (debug == true) { cout << "z malych dokladamy" << tab[kon] << endl; } dokladamy = true; kon --; } } } if (wplecaku > pojem) { wplecaku = wplecaku - tab[kon]; //kon ++; } wynik += 1; } printf("%d\n", wynik); } 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 94 95 96 97 98 99 100 101 102 103 104 105 | #include <stdio.h> #include <iostream> #include <algorithm> using namespace std; int main(int argc, char *argv[]) { bool debug = false; if (argc > 1) { debug = true; cout << "tryb debugowania" << endl; } int ileprzed = 0, ileplec = 0; scanf("%d %d", &ileprzed, &ileplec); if (debug == true) cout << "mamy " << ileprzed << " przedmiotów oraz " << ileplec << " plecaków" << endl; int tab[ileprzed]; int plecaki[ileplec]; for (int i = 0; i < ileprzed; i++) scanf("%d", &tab[i]); for (int i = 0; i < ileplec; i++) { scanf("%d", &plecaki[i]); } sort(tab, tab + ileprzed); reverse(tab, tab + ileprzed); sort(plecaki, plecaki + ileplec); reverse(plecaki, plecaki + ileplec); if (debug == true) { cout << "przedmioty: "; for (int i=0;i < ileprzed; i++) cout << tab[i] << " "; cout << endl; cout << "plecaki: "; for (int i=0;i < ileplec; i++) cout << plecaki[i] << " "; cout << endl; } if (tab[0] > plecaki[0]) puts("NIE"); else { int pocz = 0, kon = ileprzed - 1, wynik = 0, ktory = 0; while (pocz <= kon) { int pojem = plecaki[ktory]; if (debug == true) cout << "bierzemy plecak o pojemnosci " << pojem << endl; ktory ++; if (ktory == ileplec && tab[pocz] > plecaki[ktory]) { puts("NIE"); return 0; } int wplecaku = 0; bool dokladamy = true; while (dokladamy == true) { dokladamy = false; wplecaku += tab[pocz]; if (wplecaku < pojem && pocz<= kon) { if (debug == true) { cout << "z dużych dokladamy" << tab[pocz] << endl; } pocz++; dokladamy = true; } } if (wplecaku > pojem) { wplecaku = wplecaku - tab[pocz]; } dokladamy = true; while (dokladamy == true) { dokladamy = false; wplecaku += tab[kon]; if (wplecaku <= pojem && pocz <= kon) { if (wplecaku < pojem) { if (debug == true) { cout << "z malych dokladamy" << tab[kon] << endl; } dokladamy = true; kon --; } } } if (wplecaku > pojem) { wplecaku = wplecaku - tab[kon]; //kon ++; } wynik += 1; } printf("%d\n", wynik); } return 0; } |