#include #include #include #include using namespace std; const short VELKA = 1; const short MALA = 0; struct paleta { short vel; int vyska,nebezp; }; bool cmp_velikost(const paleta& a, const paleta& b) { return a.vyska < b.vyska; } bool cmp_nebezp(const paleta& a, const paleta& b) { return a.nebezp < b.nebezp; } int pridej_dostupne_palety(vector& palety, vector& velke, vector& male, int index_pocatku, int vyska_do) { for (int i = index_pocatku; i < palety.size(); i++) { if (palety[i].vyska <= vyska_do) { if (palety[i].vel == VELKA) { velke.push_back(palety[i]); push_heap(velke.begin(), velke.end(), cmp_nebezp); } else { male.push_back(palety[i]); push_heap(male.begin(), male.end(), cmp_nebezp); } } else { return i; } } } /* * Formát vstupu: program čte na standardním vstupu: * počáteční_výška počet_palet * velikost1 výška1 nebezpečnost1 * velikost2 výška2 nebezpečnost2 * ... * * Velikost 0 = malá, 1 = velká */ int main(int argc, char** argv) { vector palety; int h0,N; // Počáteční výška, počet palet scanf("%d %d", &h0, &N); for (int i = 0; i < N; i++) { paleta p; scanf("%d %d %d", &p.vel, &p.vyska, &p.nebezp); palety.push_back(p); // Přidám paletu na konec pole (vektoru) palet } // Setřídím palety podle velikosti vzestupně sort(palety.begin(), palety.end(), cmp_velikost); int pocet_krabic[2]; for (int beh = 0; beh < 2; beh++) { // Začnu malou, nebo velkou krabicí? vector velke, male; int h=h0, posledni_index_v_palety=0; short kterou_velikost = beh; pocet_krabic[beh] = 0; for (int i = 0; i < palety.size(); i++) { posledni_index_v_palety = pridej_dostupne_palety(palety, velke, male, posledni_index_v_palety, h); // Vyberu nejnebezpečnější paletu z dostupných if ((kterou_velikost == VELKA) && (velke.size() > 0)) { h += velke[velke.size()-1].nebezp; pop_heap(velke.begin(), velke.end(), cmp_nebezp); velke.pop_back(); } else if ((kterou_velikost == MALA) && (male.size() > 0)) { h += male[male.size()-1].nebezp; pop_heap(male.begin(), male.end(), cmp_nebezp); male.pop_back(); } else { break; } kterou_velikost = (kterou_velikost + 1) % 2; // 1->0 a 0->1 pocet_krabic[beh] += 1; } } printf("Lze vynest: %d krabic.\n", max(pocet_krabic[0], pocet_krabic[1])); return 0; }