#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; } } |
English