kdzhr

Калькулятор/DP

Mar 24th, 2020
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.28 KB | None | 0 0
  1. // OK B region first day 16/17 https://informatics.mccme.ru/mod/statements/view3.php?id=24702&chapterid=113440#
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <limits>
  6.  
  7. int main() {
  8.     uint64_t n;
  9.     size_t a, b, c;
  10.     std::cin >> n >> a >> b >> c;
  11.     std::vector<std::vector<std::vector<uint64_t>>> m(a + 1);
  12.     for (size_t i = 0; i <= a; i++) {
  13.         m[i].resize(b + 1);
  14.         for (size_t j = 0; j <= b; j++) {
  15.             m[i][j].resize(c + 1);
  16.             for (size_t k = 0; k <= c; k++) {
  17.                 m[i][j][k] = std::numeric_limits<uint64_t>::max();
  18.             }
  19.         }
  20.     }
  21.     m[0][0][0] = n;
  22.  
  23.     for (int32_t i = 0; i <= a; i++) {
  24.         for (int32_t j = 0; j <= b; j++) {
  25.             for (int32_t k = 0; k <= c; k++) {
  26.                 if (i + j + k == 0) continue;
  27.                 if (i != 0) {
  28.                     m[i][j][k] = m[i - 1][j][k] / 2;
  29.                 }
  30.                 if (j != 0 && m[i][j][k] > (m[i][j - 1][k] + 1) / 2) {
  31.                     m[i][j][k] = (m[i][j - 1][k] + 1) / 2;
  32.                 }
  33.                 if (k != 0 && m[i][j][k] > (m[i][j][k - 1] - 1) / 2) {
  34.                     m[i][j][k] = (m[i][j][k - 1] - 1) / 2;
  35.                 }
  36.             }
  37.         }
  38.     }
  39.     std::cout << m[a][b][c];
  40.     return 0;
  41. }
Add Comment
Please, Sign In to add comment