#include<cstdio>
#include<utility>
#include<vector>
#include<set>
#include<algorithm>
#define iter multiset< pair<int,int> >::iterator
using namespace std;
// priorytet = koniec - czas potrzebny na wykonanie
// im nizszy, tym pilniejsze zadanie
// priorytet rowny obecnemu czasowi oznacza koniecznosc natychmiastowego wykonania
int ilezadan, procesory;
int lacznyczas; // czas w trakcie ktorego wykonuja sie wszystkie zadania
int pocz, kon, czas, priorytet;
vector< pair<int,int> > nowezadania[1000005]; // nowe zadania w i-tej sekundzie; zadania w formie (priorytet, czas)
multiset< pair<int,int> > zadania; // aktualne zadania; zadania w formie (priorytet, pozostaly czas)
int jeszczemoge; // ile jeszcze mam dostepnego czasu procesorow
int konieczne; // ile zadan musi zostac wykonanych w tym momencie
vector< pair<int,int> > dowrzucenia; // wykonane zadania wrzucam do seta na sam koniec zeby nie odczytywac ich dwa razy
int main()
{
scanf("%d%d",&ilezadan,&procesory);
for(int i=0; i<ilezadan; i++)
{
scanf("%d%d%d",&pocz,&kon,&czas);
priorytet = kon - czas;
lacznyczas = max(lacznyczas, kon);
nowezadania[pocz].push_back(make_pair(priorytet, czas));
}
for(int i=0; i<=lacznyczas; i++)
{
for(int j=0; j<nowezadania[i].size(); j++)
zadania.insert(nowezadania[i][j]);
/*printf("[%d]",i);
for(iter it=zadania.begin(); it!=zadania.end(); it++)
printf("(%d,%d)",(*it).first,(*it).second);
printf("\n");*/
jeszczemoge = procesory;
konieczne = 0;
while(zadania.begin() != zadania.end())
{
iter it = zadania.begin();
priorytet = (*it).first; czas = (*it).second;
if(priorytet <= i)
{
konieczne++;
if(konieczne > procesory)
{
printf("NIE\n");
return 0;
}
}
if(jeszczemoge == 0)
break;
if(czas > 1)
{
jeszczemoge--;
zadania.erase(it);
dowrzucenia.push_back(make_pair(priorytet+1,czas-1));
}
if(czas == 1)
{
jeszczemoge--;
zadania.erase(it);
}
}
iter it = zadania.begin();
for(int j=0; j<dowrzucenia.size(); j++)
it = zadania.insert(it, dowrzucenia[j]);
dowrzucenia.clear();
}
printf("TAK\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 74 75 76 77 78 | #include<cstdio> #include<utility> #include<vector> #include<set> #include<algorithm> #define iter multiset< pair<int,int> >::iterator using namespace std; // priorytet = koniec - czas potrzebny na wykonanie // im nizszy, tym pilniejsze zadanie // priorytet rowny obecnemu czasowi oznacza koniecznosc natychmiastowego wykonania int ilezadan, procesory; int lacznyczas; // czas w trakcie ktorego wykonuja sie wszystkie zadania int pocz, kon, czas, priorytet; vector< pair<int,int> > nowezadania[1000005]; // nowe zadania w i-tej sekundzie; zadania w formie (priorytet, czas) multiset< pair<int,int> > zadania; // aktualne zadania; zadania w formie (priorytet, pozostaly czas) int jeszczemoge; // ile jeszcze mam dostepnego czasu procesorow int konieczne; // ile zadan musi zostac wykonanych w tym momencie vector< pair<int,int> > dowrzucenia; // wykonane zadania wrzucam do seta na sam koniec zeby nie odczytywac ich dwa razy int main() { scanf("%d%d",&ilezadan,&procesory); for(int i=0; i<ilezadan; i++) { scanf("%d%d%d",&pocz,&kon,&czas); priorytet = kon - czas; lacznyczas = max(lacznyczas, kon); nowezadania[pocz].push_back(make_pair(priorytet, czas)); } for(int i=0; i<=lacznyczas; i++) { for(int j=0; j<nowezadania[i].size(); j++) zadania.insert(nowezadania[i][j]); /*printf("[%d]",i); for(iter it=zadania.begin(); it!=zadania.end(); it++) printf("(%d,%d)",(*it).first,(*it).second); printf("\n");*/ jeszczemoge = procesory; konieczne = 0; while(zadania.begin() != zadania.end()) { iter it = zadania.begin(); priorytet = (*it).first; czas = (*it).second; if(priorytet <= i) { konieczne++; if(konieczne > procesory) { printf("NIE\n"); return 0; } } if(jeszczemoge == 0) break; if(czas > 1) { jeszczemoge--; zadania.erase(it); dowrzucenia.push_back(make_pair(priorytet+1,czas-1)); } if(czas == 1) { jeszczemoge--; zadania.erase(it); } } iter it = zadania.begin(); for(int j=0; j<dowrzucenia.size(); j++) it = zadania.insert(it, dowrzucenia[j]); dowrzucenia.clear(); } printf("TAK\n"); return 0; } |
English