Advertisement
fenixD3

Payout for cabbies

Sep 30th, 2023
916
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <ranges>
  5. #include <cassert>
  6. #include <numeric>
  7.  
  8. template <typename TCont>
  9. void print(const TCont& s, std::string delim = " ")
  10. {
  11.     std::ranges::copy(s, std::ostream_iterator<typename TCont::value_type>(std::cout, delim.c_str()));
  12.     std::cout << std::endl;
  13. }
  14.  
  15. template <template <typename> class TCont, typename TType>
  16. TCont<TType> fill_from(int count, std::istream& from)
  17. {
  18.     TCont<TType> seq;
  19.     seq.reserve(count);
  20.  
  21.     std::ranges::copy(
  22.         std::ranges::istream_view<TType>(from),
  23.         std::inserter(seq, seq.end()));
  24.  
  25.     return seq;
  26. }
  27.  
  28. int get_minimum_cash(const std::vector<int>& rankings)
  29. {
  30.     constexpr int BaseSum = 500;
  31.  
  32.     std::vector<int> bonuses(rankings.size());
  33.  
  34.     auto find_not_payed_min = [&rankings, &bonuses]() -> int
  35.     {
  36.         int min_idx = -1;
  37.         for (auto i = 0; i < rankings.size(); ++i)
  38.         {
  39.             if (bonuses[i] != 0)
  40.             {
  41.                 continue;
  42.             }
  43.  
  44.             if (min_idx == -1 || rankings[i] < rankings[min_idx])
  45.             {
  46.                 min_idx = i;
  47.             }
  48.         }
  49.         return min_idx;
  50.     };
  51.  
  52.     for (int min_idx = find_not_payed_min(); min_idx != -1; min_idx = find_not_payed_min())
  53.     {
  54.         bonuses[min_idx] = BaseSum;
  55.  
  56.         for (auto i = min_idx - 1; i >= 0 && rankings[i] > rankings[i + 1] && bonuses[i] == 0; --i)
  57.         {
  58.             bonuses[i] = bonuses[i + 1] + BaseSum;
  59.         }
  60.         for (auto i = min_idx + 1; i < rankings.size() && rankings[i] > rankings[i - 1] && bonuses[i] == 0; ++i)
  61.         {
  62.             bonuses[i] = bonuses[i - 1] + BaseSum;
  63.         }
  64.     }
  65.     int result = std::accumulate(bonuses.begin(), bonuses.end(), 0);
  66.     return result;
  67. }
  68.  
  69. void run_tests()
  70. {
  71.     {
  72.         std::vector<int> ratings = {1, 2, 3, 4};
  73.         assert(get_minimum_cash(ratings) == 5000);
  74.     }
  75.     {
  76.         std::vector<int> ratings = {5, 5, 5, 5};
  77.         assert(get_minimum_cash(ratings) == 2000);
  78.     }
  79.     {
  80.         std::vector<int> ratings = {4, 2, 3, 3};
  81.         assert(get_minimum_cash(ratings) == 3000);
  82.     }
  83.     {
  84.         std::vector<int> ratings = {1};
  85.         assert(get_minimum_cash(ratings) == 500);
  86.     }
  87.     {
  88.         std::vector<int> ratings = {0};
  89.         assert(get_minimum_cash(ratings) == 500);
  90.     }
  91.     {
  92.         std::vector<int> ratings = {4, 3, 2, 1};
  93.         assert(get_minimum_cash(ratings) == 5000);
  94.     }
  95.     {
  96.         std::vector<int> ratings = {1, 1, 2, 3};
  97.         assert(get_minimum_cash(ratings) == 3500);
  98.     }
  99.     {
  100.         std::vector<int> ratings = {1, 4, 1, 3};
  101.         assert(get_minimum_cash(ratings) == 3000);
  102.     }
  103.     {
  104.         std::vector<int> ratings = {1, 4, 4, 1};
  105.         assert(get_minimum_cash(ratings) == 3000);
  106.     }
  107.     {
  108.         std::vector<int> ratings = {1, 4, 4, 5};
  109.         assert(get_minimum_cash(ratings) == 3000);
  110.     }
  111.     {
  112.         std::vector<int> ratings = {4, 4, 5, 5};
  113.         assert(get_minimum_cash(ratings) == 2500);
  114.     }
  115.     {
  116.         std::vector<int> ratings = {4, 3, 2, 1, 2, 3, 4};
  117.         assert(get_minimum_cash(ratings) == 9500);
  118.     }
  119.     {
  120.         std::vector<int> ratings = {4, 3, 2, 1, 1, 2, 3, 4};
  121.         assert(get_minimum_cash(ratings) == 10000);
  122.     }
  123.     {
  124.         std::vector<int> ratings = {1, 2, 3, 4, 4, 3, 2, 1};
  125.         assert(get_minimum_cash(ratings) == 10000);
  126.     }
  127.     {
  128.         std::vector<int> ratings = {1, 2, 3, 4, 3, 2, 1};
  129.         assert(get_minimum_cash(ratings) == 8000);
  130.     }
  131.     {
  132.         std::vector<int> ratings = {2, 3, 5, 4, 1, 5, 1, 3, 1};
  133.         assert(get_minimum_cash(ratings) == 7500);
  134.     }
  135.     {
  136.         std::vector<int> ratings = {4, 1, 5, 1, 3, 1};
  137.         assert(get_minimum_cash(ratings) == 4500);
  138.     }
  139.     {
  140.         std::vector<int> ratings = {4, 1, 2, 4, 4, 2, 1, 3};
  141.         assert(get_minimum_cash(ratings) == 8000);
  142.     }
  143. }
  144.  
  145. int main()
  146. {
  147.     run_tests();
  148. //    int n;
  149. //    std::cin >> n;
  150. //
  151. //    std::vector<int> rankings = fill_from<std::vector, int>(n, std::cin);
  152. //    std::cout << get_minimum_cash(rankings) << std::endl;
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement