#include<iostream> #include<vector> #include"kollib.h" #include"message.h" //Message /* int NumberOfNodes() {return 1;} int MyNodeId() {return 0;} void PutInt(int target, int value) {} void Send(int target) {} int Receive(int source) {return source;} int GetInt(int source) {return -1;} */ using namespace std; long mojKomputer; long studentow; long wyniki[200]; long zwroconychWynikow = 0; void ZwrocWynik(long zadanie, long wynik) { if(wynik > studentow / 2) wynik = studentow - wynik; if(mojKomputer == 0) { wyniki[zadanie] = wynik; ++zwroconychWynikow; } else { PutInt(0, zadanie); PutInt(0, wynik); } } struct tZapytania { long id, from, to, wynik; char stan; //0; P; K; R=PK; L=KP tZapytania(long _i, long _f, long _t) : id(_i), from(_f), to(_t), wynik(0), stan('0') {}; }; int main() { ios_base::sync_with_stdio(0); long komputerow = NumberOfNodes(); mojKomputer = MyNodeId(); studentow = NumberOfStudents(); long zapytan = NumberOfQueries(); if(zapytan == 0) return 0; vector<tZapytania> mojeZapytania; for(long i = 0; i < zapytan; i++) if(mojKomputer == i % komputerow) mojeZapytania.push_back(tZapytania(i, QueryFrom(i + 1), QueryTo(i + 1))); if(mojeZapytania.empty()) return 0; long aktualny = 1; long poprzedni = 0; long kandydat; while(true) { size_t i = 0; while(i < mojeZapytania.size()) { if(mojeZapytania[i].from == aktualny) { if(mojeZapytania[i].stan == '0') { mojeZapytania[i].stan = 'P'; mojeZapytania[i].wynik = 0; } else mojeZapytania[i].stan = 'L'; } if(mojeZapytania[i].to == aktualny) { if(mojeZapytania[i].stan == '0') mojeZapytania[i].stan = 'K'; else mojeZapytania[i].stan = 'R'; } if(mojeZapytania[i].stan == 'R') { ZwrocWynik(mojeZapytania[i].id, mojeZapytania[i].wynik); mojeZapytania.erase(mojeZapytania.begin() + i); } else { if(mojeZapytania[i].stan != 'K') ++mojeZapytania[i].wynik; ++i; } } if(!mojeZapytania.size()) break; kandydat = FirstNeighbor(aktualny); if(kandydat == poprzedni) { poprzedni = aktualny; aktualny = SecondNeighbor(aktualny); } else { poprzedni = aktualny; aktualny = kandydat; } if(aktualny == 1) break; } for(vector<tZapytania>::iterator it = mojeZapytania.begin(); it != mojeZapytania.end(); ++it) ZwrocWynik(it->id, it->wynik); if(mojKomputer == 0) { while(zwroconychWynikow < zapytan) { int source = Receive(-1); long zadanie = GetInt(source); while(zadanie >= 0) { wyniki[zadanie] = GetInt(source); ++zwroconychWynikow; zadanie = GetInt(source); } } for(long i = 0; i < zapytan; i++) cout << wyniki[i] << endl; } else { PutInt(0, -1); Send(0); } 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 | #include<iostream> #include<vector> #include"kollib.h" #include"message.h" //Message /* int NumberOfNodes() {return 1;} int MyNodeId() {return 0;} void PutInt(int target, int value) {} void Send(int target) {} int Receive(int source) {return source;} int GetInt(int source) {return -1;} */ using namespace std; long mojKomputer; long studentow; long wyniki[200]; long zwroconychWynikow = 0; void ZwrocWynik(long zadanie, long wynik) { if(wynik > studentow / 2) wynik = studentow - wynik; if(mojKomputer == 0) { wyniki[zadanie] = wynik; ++zwroconychWynikow; } else { PutInt(0, zadanie); PutInt(0, wynik); } } struct tZapytania { long id, from, to, wynik; char stan; //0; P; K; R=PK; L=KP tZapytania(long _i, long _f, long _t) : id(_i), from(_f), to(_t), wynik(0), stan('0') {}; }; int main() { ios_base::sync_with_stdio(0); long komputerow = NumberOfNodes(); mojKomputer = MyNodeId(); studentow = NumberOfStudents(); long zapytan = NumberOfQueries(); if(zapytan == 0) return 0; vector<tZapytania> mojeZapytania; for(long i = 0; i < zapytan; i++) if(mojKomputer == i % komputerow) mojeZapytania.push_back(tZapytania(i, QueryFrom(i + 1), QueryTo(i + 1))); if(mojeZapytania.empty()) return 0; long aktualny = 1; long poprzedni = 0; long kandydat; while(true) { size_t i = 0; while(i < mojeZapytania.size()) { if(mojeZapytania[i].from == aktualny) { if(mojeZapytania[i].stan == '0') { mojeZapytania[i].stan = 'P'; mojeZapytania[i].wynik = 0; } else mojeZapytania[i].stan = 'L'; } if(mojeZapytania[i].to == aktualny) { if(mojeZapytania[i].stan == '0') mojeZapytania[i].stan = 'K'; else mojeZapytania[i].stan = 'R'; } if(mojeZapytania[i].stan == 'R') { ZwrocWynik(mojeZapytania[i].id, mojeZapytania[i].wynik); mojeZapytania.erase(mojeZapytania.begin() + i); } else { if(mojeZapytania[i].stan != 'K') ++mojeZapytania[i].wynik; ++i; } } if(!mojeZapytania.size()) break; kandydat = FirstNeighbor(aktualny); if(kandydat == poprzedni) { poprzedni = aktualny; aktualny = SecondNeighbor(aktualny); } else { poprzedni = aktualny; aktualny = kandydat; } if(aktualny == 1) break; } for(vector<tZapytania>::iterator it = mojeZapytania.begin(); it != mojeZapytania.end(); ++it) ZwrocWynik(it->id, it->wynik); if(mojKomputer == 0) { while(zwroconychWynikow < zapytan) { int source = Receive(-1); long zadanie = GetInt(source); while(zadanie >= 0) { wyniki[zadanie] = GetInt(source); ++zwroconychWynikow; zadanie = GetInt(source); } } for(long i = 0; i < zapytan; i++) cout << wyniki[i] << endl; } else { PutInt(0, -1); Send(0); } return 0; } |