#include <iostream>
#include <algorithm>
using namespace std;
struct Zadanie{
int poczatek;
int koniec;
int czas;
};
struct Pozycja{
int koniec;
int czas;
};
bool operator<(const Zadanie& l, const Zadanie& r)
{
return l.poczatek < r.poczatek;
}
bool operator<(const Pozycja& l, const Pozycja& r)
{
return l.koniec < r.koniec;
}
int main() {
int maks = 1000000 + 5;
int n; // ilosc zadan
cin >> n;
int m; // ilosc procesorow
cin >> m;
// moze ilosc procesorow wystarczy?
if (n <= m){
cout << "TAK";
return 0;
}
// Lista zadan
Zadanie zadania[101];
// wskaznik do listy zadan
int wskZad = 0;
// wczytujemy zadania
for (int i=0; i<n; i++){
cin >> zadania[i].poczatek >> zadania[i].koniec >> zadania[i].czas;
}
// wartownik
zadania[n].poczatek = maks;
zadania[n].koniec = maks;
zadania[n].czas = 1;
// sortujemy wg poczatkow obslugi
sort(zadania, zadania + n);
//skaner, miejsce przechowywania zadan aktualnie przetwarzanych
Pozycja skaner[101];
int ileSkan = 0; // ile zadan aktualnie sprawdza skaner(jest w skanerze); 0 - skaner pusty
int ileZostalo = n; // ile zadan zostalo do obsluzenia (jest w skanerze lub jeszcze czeka na swoja kolejke)
// ZACZYNAMY
int wskCzasu = zadania[0].poczatek; // chwila rozpoczecia obslugi zadan
while (wskCzasu < maks){
// ew. pobieramy pozycje z listy zadan
// gdy dodalismy nowe pozycje trzeba posortowac skaner
bool dodano = false;
while (wskCzasu == zadania[wskZad].poczatek){
skaner[ileSkan].koniec = zadania[wskZad].koniec;
skaner[ileSkan].czas = zadania[wskZad].czas;
ileSkan++;
wskZad++;
dodano = true;
}
if (dodano) sort(skaner, skaner+ileSkan);
//dla pierwszych n pozycji zmniejszamy czas o 1
//gdy czas zmniejszymy do zera trzeba dokonac korekty
int iks = ileSkan;
if (iks > m) iks = m;
int zmieniono = 0;
for(int j=0; j<iks; j++){
skaner[j].czas--;
if (skaner[j].czas == 0){
skaner[j].koniec = maks;
zmieniono++;
}
}
if (zmieniono > 0){
sort(skaner, skaner+ileSkan);
ileSkan = ileSkan - zmieniono;
ileZostalo = ileZostalo - zmieniono;
}
//gdy ileZostalo == 0 to SUKCES
if (ileZostalo == 0){
cout << "TAK";
return 0;
}
//gdy czas sie skonczyl a pozycja maja czas wiekszy od zera to KICHA
if ((ileSkan >0) and (skaner[0].koniec == wskCzasu)){
cout << "NIE";
return 0;
}
wskCzasu++;
if (ileSkan == 0){
wskCzasu = zadania[wskZad].poczatek;
}
}
// cout << "NIE";
// 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 | #include <iostream> #include <algorithm> using namespace std; struct Zadanie{ int poczatek; int koniec; int czas; }; struct Pozycja{ int koniec; int czas; }; bool operator<(const Zadanie& l, const Zadanie& r) { return l.poczatek < r.poczatek; } bool operator<(const Pozycja& l, const Pozycja& r) { return l.koniec < r.koniec; } int main() { int maks = 1000000 + 5; int n; // ilosc zadan cin >> n; int m; // ilosc procesorow cin >> m; // moze ilosc procesorow wystarczy? if (n <= m){ cout << "TAK"; return 0; } // Lista zadan Zadanie zadania[101]; // wskaznik do listy zadan int wskZad = 0; // wczytujemy zadania for (int i=0; i<n; i++){ cin >> zadania[i].poczatek >> zadania[i].koniec >> zadania[i].czas; } // wartownik zadania[n].poczatek = maks; zadania[n].koniec = maks; zadania[n].czas = 1; // sortujemy wg poczatkow obslugi sort(zadania, zadania + n); //skaner, miejsce przechowywania zadan aktualnie przetwarzanych Pozycja skaner[101]; int ileSkan = 0; // ile zadan aktualnie sprawdza skaner(jest w skanerze); 0 - skaner pusty int ileZostalo = n; // ile zadan zostalo do obsluzenia (jest w skanerze lub jeszcze czeka na swoja kolejke) // ZACZYNAMY int wskCzasu = zadania[0].poczatek; // chwila rozpoczecia obslugi zadan while (wskCzasu < maks){ // ew. pobieramy pozycje z listy zadan // gdy dodalismy nowe pozycje trzeba posortowac skaner bool dodano = false; while (wskCzasu == zadania[wskZad].poczatek){ skaner[ileSkan].koniec = zadania[wskZad].koniec; skaner[ileSkan].czas = zadania[wskZad].czas; ileSkan++; wskZad++; dodano = true; } if (dodano) sort(skaner, skaner+ileSkan); //dla pierwszych n pozycji zmniejszamy czas o 1 //gdy czas zmniejszymy do zera trzeba dokonac korekty int iks = ileSkan; if (iks > m) iks = m; int zmieniono = 0; for(int j=0; j<iks; j++){ skaner[j].czas--; if (skaner[j].czas == 0){ skaner[j].koniec = maks; zmieniono++; } } if (zmieniono > 0){ sort(skaner, skaner+ileSkan); ileSkan = ileSkan - zmieniono; ileZostalo = ileZostalo - zmieniono; } //gdy ileZostalo == 0 to SUKCES if (ileZostalo == 0){ cout << "TAK"; return 0; } //gdy czas sie skonczyl a pozycja maja czas wiekszy od zera to KICHA if ((ileSkan >0) and (skaner[0].koniec == wskCzasu)){ cout << "NIE"; return 0; } wskCzasu++; if (ileSkan == 0){ wskCzasu = zadania[wskZad].poczatek; } } // cout << "NIE"; // return 0; } |
English