Advertisement
bogolyubskiyalexey

Untitled

Mar 20th, 2021
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.68 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.         //static int cnt = 0;
  18.         //std::cout << "fail: " << ++cnt << std::endl;
  19.     }
  20.     std::set<std::pair<int, int>>::iterator it = dp[processed].lower_bound({time1, 0});
  21.     /*if (it != dp[processed].end() && it->first == time1) {
  22.         if (it->second > time2) {
  23.             dp[processed].erase(it);
  24.             dp[processed].emplace(time1, time2);
  25.         }
  26.         return;
  27.     }*/
  28.     auto it1 = it;
  29.     for (int i = 0; i < 10 && it1 != dp[processed].end(); ++it1, ++i) {
  30.         if (it1->first <= time1 && it1->second <= time2) {
  31.             return;
  32.         }
  33.     }
  34.     auto it2 = std::make_reverse_iterator(it);
  35.     for (int i = 0; i < 10 && it2 != dp[processed].rend(); ++it2, ++i) {
  36.         if (it2->first <= time1 && it2->second <= time2) {
  37.             return;
  38.         }
  39.     }
  40.     /*for (auto p : dp[processed]) {
  41.         if (p.first <= time1 && p.second <= time2) {
  42.             return;
  43.         }
  44.     }*/
  45.  
  46.  
  47.     dp[processed].emplace(time1, time2);
  48.     if (processed == n) {
  49.         answer = std::min(answer, std::max(time1, time2));
  50.     }
  51. }
  52.  
  53. int main() {
  54.     int s = 0;
  55.     for (int i = 1; i <= 5000; ++i) {
  56.         s += (5000/ i) * i;
  57.     }
  58.     std::cout << s << std::endl;
  59.     std::cin >> s1 >> s2 >> d1 >> d2 >> n;
  60.     std::vector<int> h(n + 1);
  61.     int hsum = 0;
  62.     for (int i = 1; i <= n; ++i) {
  63.         //std::cin >> h[i];
  64.         h[i] = i;
  65.         hsum += h[i];
  66.     }
  67.     std::cout << "~ans = " << std::min(s1,s2) * hsum << std::endl;
  68.  
  69.     std::vector<std::set<std::pair<int, int>>> dp(n + 1);
  70.     dp[0].emplace(0,0);
  71.    
  72.     for (int i = 0; i < n; ++i) {
  73.         std::cout << "i=" << i << " : " << dp[i].size() << std::endl;
  74.         for (const auto p : dp[i]) {
  75.             int height = 0;
  76.             for (int processed = i + 1; processed <= n; ++processed) {
  77.                 height += h[processed];
  78.                 if (height > d1 && height > d2) {
  79.                     break;
  80.                 }
  81.                 int nextTook = std::max(p.second, p.first);
  82.                 if (height <= d1) {
  83.                     update(dp, processed, p.first + s1 * height, nextTook);
  84.                 }
  85.                 if (height <= d2) {
  86.                     update(dp, processed, nextTook, p.second + s2 * height);
  87.                 }
  88.             }
  89.         }
  90.     }
  91.  
  92.     std::cout << answer << std::endl;
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement