#include <iostream> #include <queue> #include <algorithm> using namespace std; int liczba_zadan, liczba_procesorow; int ostatni_czas; struct Zadanie { int pocz; int kon; int ile_trzeba; Zadanie() { } Zadanie(int pocz, int kon, int ile_trzeba) { this->pocz = pocz; this->kon = kon; this->ile_trzeba = ile_trzeba; } }; static bool operator > (Zadanie z1, Zadanie z2) { return z1.pocz < z2.pocz; } Zadanie wszystkie_zadania[100+1]; void wczytaj() { cin >> liczba_zadan >> liczba_procesorow; ostatni_czas = 0; for(int i = 0; i < liczba_zadan; ++i) { int a, b, c; cin >> a >> b >> c; wszystkie_zadania[i] = Zadanie(a, b , c); ostatni_czas = max(ostatni_czas, b); } sort(wszystkie_zadania, wszystkie_zadania+liczba_zadan, greater<Zadanie>()); } void wypisz() { for(int i = 0; i < liczba_zadan; ++i) { cout << wszystkie_zadania[i].pocz << " "; } cout << endl; } struct Do_kol { int index; Do_kol(){} Do_kol(int index) { this->index = index; } }; struct Porownawcza { int index; int moja_wartosc; Porownawcza(){} Porownawcza(int index, int moja_wartosc) { this->index = index; this->moja_wartosc = moja_wartosc; } }; static bool operator < (Porownawcza p1, Porownawcza p2) { return p1.moja_wartosc < p2.moja_wartosc; } bool oblicz(){ queue<int> kolejka; int index_dodania = 0; for(int i = 0; i < ostatni_czas; ++i) { while(index_dodania < liczba_zadan && wszystkie_zadania[index_dodania].pocz <= i) { kolejka.push(index_dodania); index_dodania++; } queue<int> do_wrzucenia; vector<Porownawcza> wekt; while (!kolejka.empty() ) { int gora = kolejka.front(); kolejka.pop(); if(wszystkie_zadania[gora].kon <= i || wszystkie_zadania[gora].ile_trzeba == 0) continue; wekt.push_back(Porownawcza(gora, wszystkie_zadania[gora].kon - (i + wszystkie_zadania[gora].ile_trzeba))); } sort(wekt.begin(), wekt.end()); for(int j = 0; j < wekt.size() && j < liczba_procesorow; ++j) { wszystkie_zadania[wekt[j].index].ile_trzeba--; kolejka.push(wekt[j].index); } for(int j = liczba_procesorow; j < wekt.size(); ++j) { kolejka.push(wekt[j].index); } } for(int i = 0; i < liczba_zadan; ++i) { if(wszystkie_zadania[i].ile_trzeba > 0) return false; } return true; } int main() { ios_base::sync_with_stdio(false); wczytaj(); //wypisz(); if(oblicz()) { cout << "TAK" << endl; } else { cout << "NIE" << endl; } 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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | #include <iostream> #include <queue> #include <algorithm> using namespace std; int liczba_zadan, liczba_procesorow; int ostatni_czas; struct Zadanie { int pocz; int kon; int ile_trzeba; Zadanie() { } Zadanie(int pocz, int kon, int ile_trzeba) { this->pocz = pocz; this->kon = kon; this->ile_trzeba = ile_trzeba; } }; static bool operator > (Zadanie z1, Zadanie z2) { return z1.pocz < z2.pocz; } Zadanie wszystkie_zadania[100+1]; void wczytaj() { cin >> liczba_zadan >> liczba_procesorow; ostatni_czas = 0; for(int i = 0; i < liczba_zadan; ++i) { int a, b, c; cin >> a >> b >> c; wszystkie_zadania[i] = Zadanie(a, b , c); ostatni_czas = max(ostatni_czas, b); } sort(wszystkie_zadania, wszystkie_zadania+liczba_zadan, greater<Zadanie>()); } void wypisz() { for(int i = 0; i < liczba_zadan; ++i) { cout << wszystkie_zadania[i].pocz << " "; } cout << endl; } struct Do_kol { int index; Do_kol(){} Do_kol(int index) { this->index = index; } }; struct Porownawcza { int index; int moja_wartosc; Porownawcza(){} Porownawcza(int index, int moja_wartosc) { this->index = index; this->moja_wartosc = moja_wartosc; } }; static bool operator < (Porownawcza p1, Porownawcza p2) { return p1.moja_wartosc < p2.moja_wartosc; } bool oblicz(){ queue<int> kolejka; int index_dodania = 0; for(int i = 0; i < ostatni_czas; ++i) { while(index_dodania < liczba_zadan && wszystkie_zadania[index_dodania].pocz <= i) { kolejka.push(index_dodania); index_dodania++; } queue<int> do_wrzucenia; vector<Porownawcza> wekt; while (!kolejka.empty() ) { int gora = kolejka.front(); kolejka.pop(); if(wszystkie_zadania[gora].kon <= i || wszystkie_zadania[gora].ile_trzeba == 0) continue; wekt.push_back(Porownawcza(gora, wszystkie_zadania[gora].kon - (i + wszystkie_zadania[gora].ile_trzeba))); } sort(wekt.begin(), wekt.end()); for(int j = 0; j < wekt.size() && j < liczba_procesorow; ++j) { wszystkie_zadania[wekt[j].index].ile_trzeba--; kolejka.push(wekt[j].index); } for(int j = liczba_procesorow; j < wekt.size(); ++j) { kolejka.push(wekt[j].index); } } for(int i = 0; i < liczba_zadan; ++i) { if(wszystkie_zadania[i].ile_trzeba > 0) return false; } return true; } int main() { ios_base::sync_with_stdio(false); wczytaj(); //wypisz(); if(oblicz()) { cout << "TAK" << endl; } else { cout << "NIE" << endl; } return 0; } |