#include "cielib.h" #include <iostream> using namespace std; int srodek(int a, int b) { return (a+b)/2; } int max_odl(int l, int p) // gdy jestesmy w srodku [l,p] to do kazdego punktu mamy max taka odleglosc { return p-srodek(l,p); } int max_odl_tab(int l[], int p[], int rozm) // robi max z max_odl po wymiarach { int wynik = 0; for( int i=0; i<rozm; i++) if(max_odl( l[i], p[i]) > wynik) wynik = max_odl( l[i], p[i]); return wynik; } int main() { bool wyjscie; int cieplo,staret; const int d = podajD(); // wymiar lasu const int R = podajR(); //dlugosc boku int t[d]; // liczby w t sa z przedzialu [0,R], tu bedzie wynik for(int i=0; i<d; i++) t[i] = R/2; //t[0]=0; int lewy[d]; int prawy [d]; // prawdziwe t[d] bedzie w przedziale [lewy[d], prawy[d]] for(int i=0; i<d; i++) { lewy[i]=0; prawy[i]=R; } //cieplo=czyCieplo(t) //pierwsze wywolanie 0, R/2, R/2,... while(prawy[0]- lewy[0] >2) // po wykonaniu dla kazdego lewy - prawy jest stale { staret=t[0]; t[0]=lewy[0]; cieplo=czyCieplo(t); for(int i=0; i<d; i++) { t[i]=prawy[i]; cieplo=czyCieplo(t); if(cieplo == 1) { lewy[i] = prawy[i] - ((prawy[i]-lewy[i])/2 )-1; } else { prawy[i] = lewy[i] + ((prawy[i] -lewy[i])/2) +1; } t[i]=staret; //powrot do poprzedniej wartosci if(i<d-1) {staret= t[i+1]; t[i+1] = lewy[i+1];} cieplo=czyCieplo(t); } for(int i=0; i<d; i++) t[i]= srodek(lewy[i], prawy[i]); //for(int i=0; i<d; i++) cout<<t[i]<<" " <<prawy[i]<<" " <<lewy[i]<<" "; //cout<<"\n"; } // mamy przedzialy dlugosci 3 for(int i=0; i<d; i++) { t[i]=lewy[i]; cieplo=czyCieplo(t); t[i] =prawy[i]; // jak cieplo to tu zostaje cieplo = czyCieplo(t); if(cieplo == 0) { t[i]=lewy[i]; cieplo=czyCieplo(t); if(cieplo == 0 ) // jak cieplo to zostaje, inaczej srodek t[i]= srodek(lewy[i], prawy[i]); } } znalazlem(t); //hura }
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 | #include "cielib.h" #include <iostream> using namespace std; int srodek(int a, int b) { return (a+b)/2; } int max_odl(int l, int p) // gdy jestesmy w srodku [l,p] to do kazdego punktu mamy max taka odleglosc { return p-srodek(l,p); } int max_odl_tab(int l[], int p[], int rozm) // robi max z max_odl po wymiarach { int wynik = 0; for( int i=0; i<rozm; i++) if(max_odl( l[i], p[i]) > wynik) wynik = max_odl( l[i], p[i]); return wynik; } int main() { bool wyjscie; int cieplo,staret; const int d = podajD(); // wymiar lasu const int R = podajR(); //dlugosc boku int t[d]; // liczby w t sa z przedzialu [0,R], tu bedzie wynik for(int i=0; i<d; i++) t[i] = R/2; //t[0]=0; int lewy[d]; int prawy [d]; // prawdziwe t[d] bedzie w przedziale [lewy[d], prawy[d]] for(int i=0; i<d; i++) { lewy[i]=0; prawy[i]=R; } //cieplo=czyCieplo(t) //pierwsze wywolanie 0, R/2, R/2,... while(prawy[0]- lewy[0] >2) // po wykonaniu dla kazdego lewy - prawy jest stale { staret=t[0]; t[0]=lewy[0]; cieplo=czyCieplo(t); for(int i=0; i<d; i++) { t[i]=prawy[i]; cieplo=czyCieplo(t); if(cieplo == 1) { lewy[i] = prawy[i] - ((prawy[i]-lewy[i])/2 )-1; } else { prawy[i] = lewy[i] + ((prawy[i] -lewy[i])/2) +1; } t[i]=staret; //powrot do poprzedniej wartosci if(i<d-1) {staret= t[i+1]; t[i+1] = lewy[i+1];} cieplo=czyCieplo(t); } for(int i=0; i<d; i++) t[i]= srodek(lewy[i], prawy[i]); //for(int i=0; i<d; i++) cout<<t[i]<<" " <<prawy[i]<<" " <<lewy[i]<<" "; //cout<<"\n"; } // mamy przedzialy dlugosci 3 for(int i=0; i<d; i++) { t[i]=lewy[i]; cieplo=czyCieplo(t); t[i] =prawy[i]; // jak cieplo to tu zostaje cieplo = czyCieplo(t); if(cieplo == 0) { t[i]=lewy[i]; cieplo=czyCieplo(t); if(cieplo == 0 ) // jak cieplo to zostaje, inaczej srodek t[i]= srodek(lewy[i], prawy[i]); } } znalazlem(t); //hura } |