#include <cstdio>
#include <cstdlib>
#include "message.h"
#include "krazki.h"
//#include "krazki.cpp"
int BS(long long int tabl[],int pocz,int kon,long long int wart)
{
int tmp;
if (tabl[pocz]<wart) return 0;
while (pocz+1<kon)
{
tmp=(pocz+kon)/2;
if (tabl[tmp]<wart)
kon=tmp;
else
pocz=tmp;
}
return pocz;
}
int main()
{
long long int * min;
int Nod,ID,pocz,kon;
int N,m;
m=NumberOfDiscs();
N=PipeHeight();
Nod=NumberOfNodes();
ID=MyNodeId();
pocz=m*ID/Nod+1;
kon=m*(ID+1)/Nod+1;
min=(long long int *) malloc(sizeof(long long int)*(N+2));
min[N+1]=0;
long long int najw;
int Zajete=N+1,ilewpad=kon-pocz,gdziekon=N,przes,wolne;
long long int max=2000000000,tmp;
for (int i=1;i<=N;i++)
{
tmp=HoleDiameter(i);
if (max>tmp) max=tmp;
min[i]=max;
}
if (kon>pocz) gdziekon=BS(min,1,N+1,DiscDiameter(pocz));
for (int i=pocz;i<kon;i++)
{
tmp=DiscDiameter(i);
Zajete=BS(min,1,Zajete,tmp);
}
free(min);
int Zajete2,ilewpad2,gdziekon2;
//printf("mam ID %d. analizuje krazki %d - %d. zajety: %d ilewpad: %d gdziekon: %d\n",ID,pocz,kon,Zajete,ilewpad,gdziekon);
if (ID!=0)
{
PutInt(0,Zajete);
PutInt(0,ilewpad);
PutInt(0,gdziekon);
Send(0);
}
else
{
for (int i=1;i<Nod;i++)
{
Receive(i);
Zajete2=GetInt(i);
ilewpad2=GetInt(i);
gdziekon2=GetInt(i);
if (gdziekon2<Zajete)
{
Zajete=Zajete2;
} else
{
przes=gdziekon2-Zajete+1;
wolne=gdziekon2-Zajete2-ilewpad2+1;
if (wolne>=przes)
Zajete=Zajete2;
else
Zajete=Zajete2-(przes-wolne);
}
if (Zajete<1)
{
printf("0\n");
return 0;
}
}
//printf("mam ID %d. analizuje krazki %d - %d. zajety: %d ilewpad: %d gdziekon: %d\n",ID,pocz,kon,Zajete,ilewpad,gdziekon);
printf("%d\n",Zajete);
}
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 | #include <cstdio> #include <cstdlib> #include "message.h" #include "krazki.h" //#include "krazki.cpp" int BS(long long int tabl[],int pocz,int kon,long long int wart) { int tmp; if (tabl[pocz]<wart) return 0; while (pocz+1<kon) { tmp=(pocz+kon)/2; if (tabl[tmp]<wart) kon=tmp; else pocz=tmp; } return pocz; } int main() { long long int * min; int Nod,ID,pocz,kon; int N,m; m=NumberOfDiscs(); N=PipeHeight(); Nod=NumberOfNodes(); ID=MyNodeId(); pocz=m*ID/Nod+1; kon=m*(ID+1)/Nod+1; min=(long long int *) malloc(sizeof(long long int)*(N+2)); min[N+1]=0; long long int najw; int Zajete=N+1,ilewpad=kon-pocz,gdziekon=N,przes,wolne; long long int max=2000000000,tmp; for (int i=1;i<=N;i++) { tmp=HoleDiameter(i); if (max>tmp) max=tmp; min[i]=max; } if (kon>pocz) gdziekon=BS(min,1,N+1,DiscDiameter(pocz)); for (int i=pocz;i<kon;i++) { tmp=DiscDiameter(i); Zajete=BS(min,1,Zajete,tmp); } free(min); int Zajete2,ilewpad2,gdziekon2; //printf("mam ID %d. analizuje krazki %d - %d. zajety: %d ilewpad: %d gdziekon: %d\n",ID,pocz,kon,Zajete,ilewpad,gdziekon); if (ID!=0) { PutInt(0,Zajete); PutInt(0,ilewpad); PutInt(0,gdziekon); Send(0); } else { for (int i=1;i<Nod;i++) { Receive(i); Zajete2=GetInt(i); ilewpad2=GetInt(i); gdziekon2=GetInt(i); if (gdziekon2<Zajete) { Zajete=Zajete2; } else { przes=gdziekon2-Zajete+1; wolne=gdziekon2-Zajete2-ilewpad2+1; if (wolne>=przes) Zajete=Zajete2; else Zajete=Zajete2-(przes-wolne); } if (Zajete<1) { printf("0\n"); return 0; } } //printf("mam ID %d. analizuje krazki %d - %d. zajety: %d ilewpad: %d gdziekon: %d\n",ID,pocz,kon,Zajete,ilewpad,gdziekon); printf("%d\n",Zajete); } return 0; } |
English