#include <vector> #include <iostream> #include <algorithm> #include "cielib.h" struct Bound { explicit Bound(int s,int d): start(s), koniec(d) {}; int start=0; int koniec=0; }; int main() { int d=podajD(); int r=podajR(); Bound b(0,r); std::vector<int> pozycje(d, 0); std::vector<Bound> granice(d, b); for(int i=0; i<d; ++i) { pozycje[i] = (r+1) >> 1; } int pozostalo=d; for(int i=0; pozostalo>0; i=(i+1)%d) { Bound &g = granice[i]; int pozycja = pozycje[i]; if (g.start == g.koniec) { continue; } pozycje[i] = g.start; czyCieplo(&pozycje[0]); pozycje[i] = g.koniec; int prawy = czyCieplo(&pozycje[0]); pozycje[i] = g.start; int lewy = czyCieplo(&pozycje[0]); if (prawy == lewy) { pozycje[i] = g.start = g.koniec = pozycja; } else if (prawy > lewy) { if (g.koniec-g.start == 2) { pozycje[i] = g.start = g.koniec; } else { g.start = std::min(pozycja+1,r); while(g.koniec-g.start < 2) { g.start--; } pozycje[i] = g.start + (g.koniec-g.start)/2; } } else { /* lewy > prawy */ if (g.koniec-g.start == 2) { pozycje[i] = g.koniec = g.start; } else { g.koniec = std::max(0,pozycja-1); while(g.koniec-g.start < 2) { g.koniec++; } pozycje[i] = g.start + (g.koniec-g.start)/2; } } if (g.koniec == g.start) { pozostalo--; } } znalazlem(&pozycje[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 | #include <vector> #include <iostream> #include <algorithm> #include "cielib.h" struct Bound { explicit Bound(int s,int d): start(s), koniec(d) {}; int start=0; int koniec=0; }; int main() { int d=podajD(); int r=podajR(); Bound b(0,r); std::vector<int> pozycje(d, 0); std::vector<Bound> granice(d, b); for(int i=0; i<d; ++i) { pozycje[i] = (r+1) >> 1; } int pozostalo=d; for(int i=0; pozostalo>0; i=(i+1)%d) { Bound &g = granice[i]; int pozycja = pozycje[i]; if (g.start == g.koniec) { continue; } pozycje[i] = g.start; czyCieplo(&pozycje[0]); pozycje[i] = g.koniec; int prawy = czyCieplo(&pozycje[0]); pozycje[i] = g.start; int lewy = czyCieplo(&pozycje[0]); if (prawy == lewy) { pozycje[i] = g.start = g.koniec = pozycja; } else if (prawy > lewy) { if (g.koniec-g.start == 2) { pozycje[i] = g.start = g.koniec; } else { g.start = std::min(pozycja+1,r); while(g.koniec-g.start < 2) { g.start--; } pozycje[i] = g.start + (g.koniec-g.start)/2; } } else { /* lewy > prawy */ if (g.koniec-g.start == 2) { pozycje[i] = g.koniec = g.start; } else { g.koniec = std::max(0,pozycja-1); while(g.koniec-g.start < 2) { g.koniec++; } pozycje[i] = g.start + (g.koniec-g.start)/2; } } if (g.koniec == g.start) { pozostalo--; } } znalazlem(&pozycje[0]); return 0; } |