Advertisement
bogolyubskiyalexey

Untitled

Mar 20th, 2021
944
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <iostream>
  2. #include <unordered_map>
  3. #include <map>
  4. #include <vector>
  5. #include <set>
  6. #include <unordered_set>
  7.  
  8. int answer = std::numeric_limits<int>::max();
  9. int n;
  10.  
  11. int s1, s2, d1, d2;
  12.  
  13. template <class T>
  14. void update(T& dp, int processed, int time1, int time2) {
  15.     if (time1 >= answer || time2 >= answer) {
  16.         return;
  17.     }
  18.     if (processed == n) {
  19.         answer = std::max(time1, time2);
  20.         return;
  21.     }
  22.     std::set<std::pair<int, int>>::iterator it = dp[processed].lower_bound({time1, 0});
  23.  
  24.     auto it1 = it;
  25.     for (int i = 0; i < 3 && it1 != dp[processed].end(); ++it1, ++i) {
  26.         if (it1->first <= time1 && it1->second <= time2) {
  27.             return;
  28.         }
  29.     }
  30.     auto it2 = std::make_reverse_iterator(it);
  31.     for (int i = 0; i < 3 && it2 != dp[processed].rend(); ++it2, ++i) {
  32.         if (it2->first <= time1 && it2->second <= time2) {
  33.             return;
  34.         }
  35.     }
  36.  
  37.  
  38.  
  39.     dp[processed].emplace(time1, time2);
  40. }
  41.  
  42. int main() {
  43.     std::cin >> s1 >> s2 >> d1 >> d2 >> n;
  44.     std::vector<int> h(n + 10);
  45.     for (int i = 1; i <= n; ++i) {
  46.         h[i] = (i % 50) +1;
  47.         //std::cin >> h[i];
  48.     }
  49.  
  50.     std::vector<std::set<std::pair<int, int>>> dp(n + 1);
  51.     dp[0].emplace(0,0);
  52.    
  53.     for (int i = 0; i < n; ++i) {
  54.         //std::cout << "i=" << i << " : " << dp[i].size() << std::endl;
  55.         for (const auto p : dp[i]) {
  56.             int height = 0;
  57.             for (int processed = i + 1; processed <= n; ++processed) {
  58.                 height += h[processed];
  59.                 if (height > d1 && height > d2) {
  60.                     break;
  61.                 }
  62.                 int nextTook = std::max(p.second, p.first);
  63.                 bool hasNext = processed != n;
  64.                 if (height <= d1) {
  65.                     int nextTime = p.first + s1 * (height + h[processed + 1]);
  66.                     if (!hasNext || nextTime > nextTook) {
  67.                         update(dp, processed, p.first + s1 * height, nextTook);
  68.                     }
  69.                 }
  70.                 if (height <= d2) {
  71.                     int nextTime = p.second + s2 * (height + h[processed + 1]);
  72.                     if (!hasNext || nextTime > nextTook) {
  73.                         update(dp, processed, nextTook, p.second + s2 * height);
  74.                     }
  75.                 }
  76.             }
  77.         }
  78.     }
  79.  
  80.     std::cout << answer << std::endl;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement