#include <stdio.h>
int n,m,t,dt;
char czas[1000001];
struct zad
{
int p;
int k;
int dl;
signed char akt;
};
struct zad zadania[101];
void wczytaj()
{
int i,a,b,c;
for(i=0;i<1000001;++i)
if (i%13) czas[i]=0; else czas[i]=1;
scanf("%d %d\n",&n,&m);
for(i=0;i<n;++i)
{
scanf("%d %d %d",&a,&b,&c);
czas[a]=1; czas[b]=1;
zadania[i].p=a;
zadania[i].k=b;
zadania[i].dl=c;
zadania[i].akt=1;
}
czas[0]=1; czas[1000000]=1;
return;
}
int pilne(void) //zwraca indeks najpilniejszego aktywnego zadania mozliwego do wykonania od chwili t z aktualnych wpisow w tabeli zadania[0..n-1] lub -1
{
int j,a,min=1000002;
int b=-1;
for(j=0;j<n;++j)
{
if (zadania[j].p<=t && zadania[j].akt==1 && zadania[j].k>t)
{
a=zadania[j].k-t-zadania[j].dl;
if (min>a) {min=a; b=j;}
}
}
return b;
}
void aktualizuj(int j) //aktualizuje komorke zadania[j] o biezace dane;
{
zadania[j].akt=0;
return;
}
void wypisz(void)
{
int z;
printf("czas=%d\n",t);
for(z=0;z<n;z++)
{
printf("zad[%d]: %d %d %d %d\n",z,zadania[z].p,zadania[z].k,zadania[z].dl,zadania[z].akt);
}
printf("\n");
return;
}
int main()
{
int i,j,a,l,k;
wczytaj();
j=0;
// wypisz();
for(i=0;i<1000001;++i)
{
if(czas[i])
{
dt=i-j; //tyle minelo czasu od poprzedniego kroku
t=i;
for(l=0;l<n;++l)
if(zadania[l].akt==0) {zadania[l].dl-=dt; zadania[l].p=i; if(zadania[l].dl<=0) zadania[l].akt=-1; else zadania[l].akt=1;}
j=i;
a=0; l=pilne();
while(a<m && l>=0) //dopoki sa wolne procesory i pilne zadania
{
aktualizuj(l);
a++;
l=pilne();
}
k=t+1; while(k<1000001 && czas[k]==0) k++; if(k>1000000) k=t;
for(l=0;l<n;++l)
{
if(zadania[l].akt==0)
{
if(zadania[l].dl < k-t) czas[zadania[l].dl+t]=1;
}
}
// wypisz();
}
}
k=0;
for(i=0;i<n;++i)
if(zadania[i].akt!=-1) k=1;
if(k) printf("NIE"); else printf("TAK");
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 | #include <stdio.h> int n,m,t,dt; char czas[1000001]; struct zad { int p; int k; int dl; signed char akt; }; struct zad zadania[101]; void wczytaj() { int i,a,b,c; for(i=0;i<1000001;++i) if (i%13) czas[i]=0; else czas[i]=1; scanf("%d %d\n",&n,&m); for(i=0;i<n;++i) { scanf("%d %d %d",&a,&b,&c); czas[a]=1; czas[b]=1; zadania[i].p=a; zadania[i].k=b; zadania[i].dl=c; zadania[i].akt=1; } czas[0]=1; czas[1000000]=1; return; } int pilne(void) //zwraca indeks najpilniejszego aktywnego zadania mozliwego do wykonania od chwili t z aktualnych wpisow w tabeli zadania[0..n-1] lub -1 { int j,a,min=1000002; int b=-1; for(j=0;j<n;++j) { if (zadania[j].p<=t && zadania[j].akt==1 && zadania[j].k>t) { a=zadania[j].k-t-zadania[j].dl; if (min>a) {min=a; b=j;} } } return b; } void aktualizuj(int j) //aktualizuje komorke zadania[j] o biezace dane; { zadania[j].akt=0; return; } void wypisz(void) { int z; printf("czas=%d\n",t); for(z=0;z<n;z++) { printf("zad[%d]: %d %d %d %d\n",z,zadania[z].p,zadania[z].k,zadania[z].dl,zadania[z].akt); } printf("\n"); return; } int main() { int i,j,a,l,k; wczytaj(); j=0; // wypisz(); for(i=0;i<1000001;++i) { if(czas[i]) { dt=i-j; //tyle minelo czasu od poprzedniego kroku t=i; for(l=0;l<n;++l) if(zadania[l].akt==0) {zadania[l].dl-=dt; zadania[l].p=i; if(zadania[l].dl<=0) zadania[l].akt=-1; else zadania[l].akt=1;} j=i; a=0; l=pilne(); while(a<m && l>=0) //dopoki sa wolne procesory i pilne zadania { aktualizuj(l); a++; l=pilne(); } k=t+1; while(k<1000001 && czas[k]==0) k++; if(k>1000000) k=t; for(l=0;l<n;++l) { if(zadania[l].akt==0) { if(zadania[l].dl < k-t) czas[zadania[l].dl+t]=1; } } // wypisz(); } } k=0; for(i=0;i<n;++i) if(zadania[i].akt!=-1) k=1; if(k) printf("NIE"); else printf("TAK"); return 0; } |
English