kdzhr

Цветовой баланс

Feb 11th, 2020
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.52 KB | None | 0 0
  1. // contest dp цветовой баланс http://contest.uni-smr.ac.ru/ru/problemset/6268/
  2. # include <iostream>
  3. # include <vector>
  4.  
  5. using namespace std;
  6. struct dot
  7. {
  8.     int32_t previous = -1;
  9.     int32_t count_0 = 0;
  10.     int32_t count_1 = 0;
  11.     int32_t res = 0;
  12. };
  13.  
  14. int main() {
  15.     int32_t n;
  16.     cin >> n;
  17.     vector<int32_t> a;
  18.     vector<int32_t> b;
  19.     vector<vector<dot>> dp(n);
  20.     for (size_t i = 0; i < n; i++) {
  21.         dp[i].resize(2);
  22.     }
  23.     for (size_t i = 0; i < n; i++) {
  24.         int32_t cur;
  25.         cin >> cur;
  26.         a.push_back(cur);
  27.     }
  28.     for (size_t i = 0; i < n; i++) {
  29.         int32_t cur;
  30.         cin >> cur;
  31.         b.push_back(cur);
  32.     }
  33.     dot x;
  34.     x.count_0 = 1;
  35.     dp[0][0] = x;
  36.     x.count_0 = 0;
  37.     x.count_1 = 1;
  38.     dp[0][1] = x;
  39.     for (size_t i = 1; i < n; i++) {
  40.         x.res = 1000000000;
  41.         if (dp[i - 1][0].count_0 - dp[i - 1][0].count_1 < 1) {
  42.             x.res = max(dp[i - 1][0].res, abs(a[i] - a[i - 1]));
  43.             x.previous = 0;
  44.             x.count_0 = dp[i - 1][0].count_0 + 1;
  45.             x.count_1 = dp[i - 1][0].count_1;
  46.         }
  47.         if (dp[i - 1][1].count_0 - dp[i - 1][1].count_1 < 1 && max(dp[i - 1][1].res, abs(a[i] - b[i - 1])) < x.res) {
  48.             x.previous = 1;
  49.             x.res = max(dp[i - 1][1].res, abs(a[i] - b[i - 1]));
  50.             x.count_0 = dp[i - 1][1].count_0 + 1;
  51.             x.count_1 = dp[i - 1][1].count_1;
  52.         }
  53.         dp[i][0] = x;
  54.         x.res = 1000000000;
  55.         if (dp[i - 1][0].count_1 - dp[i - 1][0].count_0 < 1) {
  56.             x.res = max(dp[i - 1][0].res, abs(b[i] - a[i - 1]));
  57.             x.previous = 0;
  58.             x.count_0 = dp[i - 1][0].count_0;
  59.             x.count_1 = dp[i - 1][0].count_1 + 1;
  60.         }
  61.         if (dp[i - 1][1].count_1 - dp[i - 1][1].count_0 < 1 && max(dp[i - 1][1].res, abs(b[i] - b[i - 1])) < x.res) {
  62.             x.previous = 1;
  63.             x.res = max(dp[i - 1][1].res, abs(b[i] - b[i - 1]));
  64.             x.count_0 = dp[i - 1][1].count_0;
  65.             x.count_1 = dp[i - 1][1].count_1 + 1;
  66.         }
  67.         dp[i][1] = x;
  68.     }
  69.     cout << min(dp[n - 1][0].res, dp[n - 1][1].res) << '\n';
  70.     vector<int32_t> result;
  71.     int32_t rs = 0;
  72.     if (dp[n - 1][0].res > dp[n - 1][1].res) {
  73.         rs = 1;
  74.     }
  75.     result.push_back(rs);
  76.     for (int32_t i = n - 1; i > 0; i--) {
  77.         rs = dp[i][rs].previous;
  78.         result.push_back(rs);
  79.     }
  80.     for (int32_t i = n - 1; i >= 0; i--) {
  81.         cout << result[i] + 1 << ' ';
  82.     }
  83.     return 0;
  84. }
Add Comment
Please, Sign In to add comment