#include "cielib.h" int d, k, r; int start[501], end[501], poz[501]; inline int max(int a, int b) { return a > b ? a : b; } inline int min(int a, int b) { return a < b ? a : b; } int main() { d = podajD(); k = podajK(); r = podajR(); if (r % 2) { int maxR = 0; for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) poz[j] = r / 2; poz[i] = 0; czyCieplo(poz); poz[i] = r; if (czyCieplo(poz)) { start[i] = r == 3 ? 1 : r / 2; end[i] = r; if ((end[i] - start[i]) % 2) start[i]--; } else { for (int j = 0; j < d; ++j) poz[j] = r / 2 + 1; poz[i] = 0; czyCieplo(poz); poz[i] = r; if (czyCieplo(poz)) { start[i] = r == 3 ? 1 : r / 2; end[i] = r; if ((end[i] - start[i]) % 2) start[i]--; } else { start[i] = 0; end[i] = r == 3 ? 2 : r / 2 + 1; if ((end[i] - start[i]) % 2) end[i]++; } } maxR = max(maxR, end[i] - start[i]); } r = maxR; } else { for (int j = 0; j < d; ++j) { start[j] = 0; end[j] = r; } } while (r > 2) { int maxR = 0; for (int i = 0; i < d; ++i) { if (end[i] - start[i] != r) continue; for (int j = 0; j < d; ++j) poz[j] = (end[j] + start[j]) / 2; poz[i] = start[i]; czyCieplo(poz); poz[i] = end[i]; if (czyCieplo(poz)) { start[i] = (end[i] + start[i]) / 2; if ((end[i] - start[i]) % 2) start[i]--; } else { end[i] = (end[i] + start[i]) / 2; if ((end[i] - start[i]) % 2) end[i]++; } maxR = max(maxR, end[i] - start[i]); } r = min(r, maxR); } for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) poz[j] = (end[j] + start[j]) / 2; poz[i] = start[i]; czyCieplo(poz); poz[i] = end[i]; if (czyCieplo(poz)) { start[i] = end[i]; } else { poz[i] = start[i]; if (czyCieplo(poz)) { end[i] = start[i]; } else { start[i]++; end[i]--; } } } for (int j = 0; j < d; ++j) poz[j] = (end[j] + start[j]) / 2; znalazlem(poz); 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 | #include "cielib.h" int d, k, r; int start[501], end[501], poz[501]; inline int max(int a, int b) { return a > b ? a : b; } inline int min(int a, int b) { return a < b ? a : b; } int main() { d = podajD(); k = podajK(); r = podajR(); if (r % 2) { int maxR = 0; for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) poz[j] = r / 2; poz[i] = 0; czyCieplo(poz); poz[i] = r; if (czyCieplo(poz)) { start[i] = r == 3 ? 1 : r / 2; end[i] = r; if ((end[i] - start[i]) % 2) start[i]--; } else { for (int j = 0; j < d; ++j) poz[j] = r / 2 + 1; poz[i] = 0; czyCieplo(poz); poz[i] = r; if (czyCieplo(poz)) { start[i] = r == 3 ? 1 : r / 2; end[i] = r; if ((end[i] - start[i]) % 2) start[i]--; } else { start[i] = 0; end[i] = r == 3 ? 2 : r / 2 + 1; if ((end[i] - start[i]) % 2) end[i]++; } } maxR = max(maxR, end[i] - start[i]); } r = maxR; } else { for (int j = 0; j < d; ++j) { start[j] = 0; end[j] = r; } } while (r > 2) { int maxR = 0; for (int i = 0; i < d; ++i) { if (end[i] - start[i] != r) continue; for (int j = 0; j < d; ++j) poz[j] = (end[j] + start[j]) / 2; poz[i] = start[i]; czyCieplo(poz); poz[i] = end[i]; if (czyCieplo(poz)) { start[i] = (end[i] + start[i]) / 2; if ((end[i] - start[i]) % 2) start[i]--; } else { end[i] = (end[i] + start[i]) / 2; if ((end[i] - start[i]) % 2) end[i]++; } maxR = max(maxR, end[i] - start[i]); } r = min(r, maxR); } for (int i = 0; i < d; ++i) { for (int j = 0; j < d; ++j) poz[j] = (end[j] + start[j]) / 2; poz[i] = start[i]; czyCieplo(poz); poz[i] = end[i]; if (czyCieplo(poz)) { start[i] = end[i]; } else { poz[i] = start[i]; if (czyCieplo(poz)) { end[i] = start[i]; } else { start[i]++; end[i]--; } } } for (int j = 0; j < d; ++j) poz[j] = (end[j] + start[j]) / 2; znalazlem(poz); return 0; } |