#include "message.h"
#include "krazki.h"
#include <stdint.h>
#include <vector>
#include <iostream>
using namespace std;
int main() {
int wysokosc = PipeHeight();
int ile_krazkow = NumberOfDiscs();
if(ile_krazkow > wysokosc){ cout << 0 << '\n' ;}
else{
int N = NumberOfNodes();
vector<long long int> rurka(N);
//if(N>=wysokosc){
int ile = wysokosc/N;//jaka wysokosc przypada na dany wezel
int reszta=wysokosc-ile*N;
int start = ile * MyNodeId();//0, 100, 200
int end;
if(MyNodeId() != N-1){int end = ile * (MyNodeId() + 1);}//100, 200, 300
else{end=wysokosc;}
rurka[start]=HoleDiameter(start);
for(int i=start+1; i<end;i++){
rurka[i]=HoleDiameter(i);
if(rurka[i-1]<rurka[i]) {
rurka[i]=rurka[i-1];
}
}
int64_t szer;
if(MyNodeId() != NumberOfNodes() -1){
PutLL(MyNodeId() +1,rurka[end-2]);
Send(MyNodeId() +1);
Receive(MyNodeId() -1);
szer=GetLL( MyNodeId() -1);
for(int i=start; i<end;i++){
if(rurka[i]>szer){rurka[i]=szer;}
else{break;}
}
}
//mamy stworzona rurke, teraz wrzucamy krazki
int ile_przeslac=0;
int ost = end-1;
int64_t dl_k;
for(int i=start; i<end; i++){
if(i<ile_krazkow){
dl_k=DiscDiameter(i+1);
for(int k=ost; k>=start; k--){
if(dl_k>rurka[k]){
ile_przeslac++;
ost--;
}
else{ break;}
}
}
else{break;}
}
int zostalo= ost-start;
int64_t suma=0, plus=0, odp=0;
int x=5000;
for(int i=N-1; i>=0; i--){
if(MyNodeId() ==i ){
if(MyNodeId() != N-1) {Receive(MyNodeId() +1);
plus=GetLL( MyNodeId() +1);}
suma = suma -zostalo+plus;
if(suma>0){
PutLL(MyNodeId() -1,suma);
Send(MyNodeId() -1);
}
else{suma=0;
PutLL(MyNodeId() -1,0);
Send(MyNodeId() -1);}
}
if(ost==end-1 and plus==0){x=i+1;}
else if (i==0 and ost-plus>=0){x=6000; cout << ost-plus << '\n';}
}
if(x==5000){cout << 0 << '\n';}
if(MyNodeId() == x){
odp=ost-plus;
cout << odp << '\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 79 80 81 82 83 84 85 86 87 88 89 90 91 92 | #include "message.h" #include "krazki.h" #include <stdint.h> #include <vector> #include <iostream> using namespace std; int main() { int wysokosc = PipeHeight(); int ile_krazkow = NumberOfDiscs(); if(ile_krazkow > wysokosc){ cout << 0 << '\n' ;} else{ int N = NumberOfNodes(); vector<long long int> rurka(N); //if(N>=wysokosc){ int ile = wysokosc/N;//jaka wysokosc przypada na dany wezel int reszta=wysokosc-ile*N; int start = ile * MyNodeId();//0, 100, 200 int end; if(MyNodeId() != N-1){int end = ile * (MyNodeId() + 1);}//100, 200, 300 else{end=wysokosc;} rurka[start]=HoleDiameter(start); for(int i=start+1; i<end;i++){ rurka[i]=HoleDiameter(i); if(rurka[i-1]<rurka[i]) { rurka[i]=rurka[i-1]; } } int64_t szer; if(MyNodeId() != NumberOfNodes() -1){ PutLL(MyNodeId() +1,rurka[end-2]); Send(MyNodeId() +1); Receive(MyNodeId() -1); szer=GetLL( MyNodeId() -1); for(int i=start; i<end;i++){ if(rurka[i]>szer){rurka[i]=szer;} else{break;} } } //mamy stworzona rurke, teraz wrzucamy krazki int ile_przeslac=0; int ost = end-1; int64_t dl_k; for(int i=start; i<end; i++){ if(i<ile_krazkow){ dl_k=DiscDiameter(i+1); for(int k=ost; k>=start; k--){ if(dl_k>rurka[k]){ ile_przeslac++; ost--; } else{ break;} } } else{break;} } int zostalo= ost-start; int64_t suma=0, plus=0, odp=0; int x=5000; for(int i=N-1; i>=0; i--){ if(MyNodeId() ==i ){ if(MyNodeId() != N-1) {Receive(MyNodeId() +1); plus=GetLL( MyNodeId() +1);} suma = suma -zostalo+plus; if(suma>0){ PutLL(MyNodeId() -1,suma); Send(MyNodeId() -1); } else{suma=0; PutLL(MyNodeId() -1,0); Send(MyNodeId() -1);} } if(ost==end-1 and plus==0){x=i+1;} else if (i==0 and ost-plus>=0){x=6000; cout << ost-plus << '\n';} } if(x==5000){cout << 0 << '\n';} if(MyNodeId() == x){ odp=ost-plus; cout << odp << '\n'; } } return 0; } |
English