// Michał Wiatrowski #include <iostream> #include <vector> #include "cielib.h" using namespace std; int main() { int d, r, k; d = podajD(); r = podajR(); k = podajK(); int len = r + 1; vector<pair<int, int>> zakresy(d, make_pair(0, r)); vector<int> pos(d); while (len > 3) { for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) pos[j] = (zakresy[j].first + zakresy[j].second) / 2; int half_len = (len + 1) / 2; pos[i] = zakresy[i].first; czyCieplo(pos.data()); pos[i] = zakresy[i].second; if (czyCieplo(pos.data())) zakresy[i].first = zakresy[i].second - half_len; else zakresy[i].second = zakresy[i].first + half_len; } len = zakresy[0].second - zakresy[0].first + 1; // cerr << "koncze runde, len = " << len << endl; // for (int i = 0; i < d; ++i) // cerr << i << ": " << zakresy[i].first << "-" << zakresy[i].second << endl; } vector<int> wynik(d); for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) pos[j] = (zakresy[j].first + zakresy[j].second) / 2; auto delta = [](int first, int second) { if (!first && !second) return 0; if (first) return -1; if (second) return 1; }; int a = 1, b = 1, c = 1; czyCieplo(pos.data()); pos[i] -= 1; int dl1 = czyCieplo(pos.data()); pos[i] += 1; int dl2 = czyCieplo(pos.data()); a += delta(dl1, dl2); pos[i] += 1; int dr1 = czyCieplo(pos.data()); pos[i] -= 1; int dr2 = czyCieplo(pos.data()); c += delta(dr1, dr2); if (a < c) wynik[i] = pos[i] - 1; else if (a > c) wynik[i] = pos[i] + 1; else if (a == c) wynik[i] = pos[i]; } znalazlem(wynik.data()); }
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 | // Michał Wiatrowski #include <iostream> #include <vector> #include "cielib.h" using namespace std; int main() { int d, r, k; d = podajD(); r = podajR(); k = podajK(); int len = r + 1; vector<pair<int, int>> zakresy(d, make_pair(0, r)); vector<int> pos(d); while (len > 3) { for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) pos[j] = (zakresy[j].first + zakresy[j].second) / 2; int half_len = (len + 1) / 2; pos[i] = zakresy[i].first; czyCieplo(pos.data()); pos[i] = zakresy[i].second; if (czyCieplo(pos.data())) zakresy[i].first = zakresy[i].second - half_len; else zakresy[i].second = zakresy[i].first + half_len; } len = zakresy[0].second - zakresy[0].first + 1; // cerr << "koncze runde, len = " << len << endl; // for (int i = 0; i < d; ++i) // cerr << i << ": " << zakresy[i].first << "-" << zakresy[i].second << endl; } vector<int> wynik(d); for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) pos[j] = (zakresy[j].first + zakresy[j].second) / 2; auto delta = [](int first, int second) { if (!first && !second) return 0; if (first) return -1; if (second) return 1; }; int a = 1, b = 1, c = 1; czyCieplo(pos.data()); pos[i] -= 1; int dl1 = czyCieplo(pos.data()); pos[i] += 1; int dl2 = czyCieplo(pos.data()); a += delta(dl1, dl2); pos[i] += 1; int dr1 = czyCieplo(pos.data()); pos[i] -= 1; int dr2 = czyCieplo(pos.data()); c += delta(dr1, dr2); if (a < c) wynik[i] = pos[i] - 1; else if (a > c) wynik[i] = pos[i] + 1; else if (a == c) wynik[i] = pos[i]; } znalazlem(wynik.data()); } |