#include <iostream> #include "kollib.h" #include "message.h" int main() { long long n; n = NumberOfStudents(); //Muszę stworzyć tablicę w kolejności jak oni siedzą long long *table = new long long[n]; table[0] = 1; table[1] = FirstNeighbor(1); for ( long long y = 1; y < n - 1; y++ )//Zabrałem +1 od n i dałem -1 { if( FirstNeighbor(table[y]) == table[y-1] ) { table[y+1] = SecondNeighbor(table[y]); } else { table[y+1] = FirstNeighbor(table[y]); } } //Czas na liczenie int m = NumberOfQueries();//Liczba zapytań int v1=0, v2=0;//Przełączniki long long Czas1 = 0, Czas2 = 0; for( int y = MyNodeId() + 1; y < NumberOfQueries(); y += NumberOfNodes() ) { if( QueryFrom(y) == QueryTo(y) ) { Czas1 = 0; } else { long long u = 0; Czas1 = 0; Czas2 = 0; v1 = 0; v2 = 0; while ( 1 )//Bo raczej będzie trwać dłużej niż n { if( u >= n )//Przeskakiwanie początku { u = 0; } if( v1 == 1 ) { Czas1++; } if( v2 == 1) { Czas2++; } if( table[u] == QueryFrom(y) )//Jak natrafimy na początek { if( v1 == 0 )//Pierwszy raz { v1 = 1; //Odpalenie pierwszego zegara } else//Drugi lub jakims cudem kolejny { break; } } if( table[u] == QueryTo(y) )//Jak natrafimy na koniec { if( v1 == 1 )//Czyli juz natrafilem raz na poczatek { v1 = 2;//Wstrzymanie pierwszego zegara v2 = 1;//Odpalenie drugiego zegara } } u++; } } //Wyciagnac krotszy czas if( Czas1 > Czas2 ) { Czas1 = Czas2;//Czas1 zawsze jest tym najmniejszym } //Wysyłka PutLL( 0, Czas1 ); Send(0); } //Wyświetlanie wyników for (int instancja = 1; instancja < NumberOfNodes(); ++instancja) { Receive(instancja); std::cout << GetLL(instancja) << std::endl; } }
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 <iostream> #include "kollib.h" #include "message.h" int main() { long long n; n = NumberOfStudents(); //Muszę stworzyć tablicę w kolejności jak oni siedzą long long *table = new long long[n]; table[0] = 1; table[1] = FirstNeighbor(1); for ( long long y = 1; y < n - 1; y++ )//Zabrałem +1 od n i dałem -1 { if( FirstNeighbor(table[y]) == table[y-1] ) { table[y+1] = SecondNeighbor(table[y]); } else { table[y+1] = FirstNeighbor(table[y]); } } //Czas na liczenie int m = NumberOfQueries();//Liczba zapytań int v1=0, v2=0;//Przełączniki long long Czas1 = 0, Czas2 = 0; for( int y = MyNodeId() + 1; y < NumberOfQueries(); y += NumberOfNodes() ) { if( QueryFrom(y) == QueryTo(y) ) { Czas1 = 0; } else { long long u = 0; Czas1 = 0; Czas2 = 0; v1 = 0; v2 = 0; while ( 1 )//Bo raczej będzie trwać dłużej niż n { if( u >= n )//Przeskakiwanie początku { u = 0; } if( v1 == 1 ) { Czas1++; } if( v2 == 1) { Czas2++; } if( table[u] == QueryFrom(y) )//Jak natrafimy na początek { if( v1 == 0 )//Pierwszy raz { v1 = 1; //Odpalenie pierwszego zegara } else//Drugi lub jakims cudem kolejny { break; } } if( table[u] == QueryTo(y) )//Jak natrafimy na koniec { if( v1 == 1 )//Czyli juz natrafilem raz na poczatek { v1 = 2;//Wstrzymanie pierwszego zegara v2 = 1;//Odpalenie drugiego zegara } } u++; } } //Wyciagnac krotszy czas if( Czas1 > Czas2 ) { Czas1 = Czas2;//Czas1 zawsze jest tym najmniejszym } //Wysyłka PutLL( 0, Czas1 ); Send(0); } //Wyświetlanie wyników for (int instancja = 1; instancja < NumberOfNodes(); ++instancja) { Receive(instancja); std::cout << GetLL(instancja) << std::endl; } } |