/* Arek Wróbel * * Konkurs: Potyczki Algorytmiczne 2016, runda 3B * Zadanie: Ciepło-zimno */ #include "cielib.h" #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back #define SIZE(con) ((int)((con).size())) const int INF=1000000000; const LL INFLL=1000000000000000000LL; int d; // liczba wymiarów int r; // rozmiar hipersześcianu int k; // liczba zapytań int aktual; int krok; int p[507]; bool sprawdz() { if (!k) { znalazlem(p); } --k; //FOR(i, 0, d) {fprintf(stderr, " %d", p[i]);}fprintf(stderr, "\n"); return czyCieplo(p); } bool check(const int x) { return (0 <= x && x <= r); } bool makeKier(const int kier) { if (k < 10) { // żeby nie przerwało nam w połowie sprawdzania (akurat na złym) znalazlem(p); } bool goraZle = true; if (check(p[kier] + krok)) { p[kier] += krok; if (sprawdz()) { // W GÓRĘ POPRAWIA return true; } p[kier] -= krok; goraZle = sprawdz(); // CZY W GÓRĘ WADZI } if (check(p[kier] - krok)) { p[kier] -= krok; if (sprawdz()) { // W DÓŁ POPRAWIA return true; } p[kier] += krok; if (sprawdz()) { // W DÓŁ WADZI if (!goraZle) { // przejście w dół wadzi a w górę nie: możemy być w dolnym rogu p[kier] += krok; return false; } // przejście w obie strony wadzi, więc nie wolno się ruszyć return false; } if (goraZle) { // przejście w górę wadzi a w dół nie: możemy być w górnym rogu p[kier] -= krok; return false; } // przejście w żadną stronę nie wadzi, więc lepiej się nie ruszać return false; } return false; } void make() { //fprintf(stderr, "krok=%d\n", krok); REP(i, d) { while (makeKier(i)) ; } krok /= 2; } void MAKE_2(const int ILE) { sprawdz(); krok = ILE; while (krok) { make(); } } int main() { d = podajD(); k = podajK(); r = podajR(); FOR(i, 0, d) { p[i] = r / 2; //p[i] = 0; } while (1) { krok = max(r / 4, 1); sprawdz(); while (krok) { make(); } } 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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | /* Arek Wróbel * * Konkurs: Potyczki Algorytmiczne 2016, runda 3B * Zadanie: Ciepło-zimno */ #include "cielib.h" #include <cstdio> #include <algorithm> #include <cmath> #include <vector> using namespace std; typedef long long LL; typedef pair<int, int> PII; typedef vector<int> VI; #define REP(I, N) for(int I=0; I<(N); ++I) #define FOR(I, M, N) for(int I=(M); I<=(N); ++I) #define FORD(I, M, N) for(int I=(M); I>=(N); --I) #define FOREACH(IT, CON) for(__typeof(CON.begin()) IT=CON.begin(); IT!=CON.end(); ++IT) #define ST first #define ND second #define MP make_pair #define PB push_back #define SIZE(con) ((int)((con).size())) const int INF=1000000000; const LL INFLL=1000000000000000000LL; int d; // liczba wymiarów int r; // rozmiar hipersześcianu int k; // liczba zapytań int aktual; int krok; int p[507]; bool sprawdz() { if (!k) { znalazlem(p); } --k; //FOR(i, 0, d) {fprintf(stderr, " %d", p[i]);}fprintf(stderr, "\n"); return czyCieplo(p); } bool check(const int x) { return (0 <= x && x <= r); } bool makeKier(const int kier) { if (k < 10) { // żeby nie przerwało nam w połowie sprawdzania (akurat na złym) znalazlem(p); } bool goraZle = true; if (check(p[kier] + krok)) { p[kier] += krok; if (sprawdz()) { // W GÓRĘ POPRAWIA return true; } p[kier] -= krok; goraZle = sprawdz(); // CZY W GÓRĘ WADZI } if (check(p[kier] - krok)) { p[kier] -= krok; if (sprawdz()) { // W DÓŁ POPRAWIA return true; } p[kier] += krok; if (sprawdz()) { // W DÓŁ WADZI if (!goraZle) { // przejście w dół wadzi a w górę nie: możemy być w dolnym rogu p[kier] += krok; return false; } // przejście w obie strony wadzi, więc nie wolno się ruszyć return false; } if (goraZle) { // przejście w górę wadzi a w dół nie: możemy być w górnym rogu p[kier] -= krok; return false; } // przejście w żadną stronę nie wadzi, więc lepiej się nie ruszać return false; } return false; } void make() { //fprintf(stderr, "krok=%d\n", krok); REP(i, d) { while (makeKier(i)) ; } krok /= 2; } void MAKE_2(const int ILE) { sprawdz(); krok = ILE; while (krok) { make(); } } int main() { d = podajD(); k = podajK(); r = podajR(); FOR(i, 0, d) { p[i] = r / 2; //p[i] = 0; } while (1) { krok = max(r / 4, 1); sprawdz(); while (krok) { make(); } } return 0; } |