Advertisement
paranid5

Поездка (Сириус 2019 2) C++

Jul 11th, 2020
212
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1. /*В 2029 году три финала Всероссийской олимпиады — по химии, информатике и физкультуре — проводятся в Самаре. Из Саратова прошло много участников по каждому из этих предметов, и все они планируют ехать в Самару на поезде. Руководитель сборной по химии уже купил билеты для своих подопечных. Руководитель сборной по информатике как раз сейчас планирует этим заняться. Но программисты — странные люди, у которых есть много запросов к купленным местам. Например, они категорически не хотят ехать в одном вагоне со спортсменами (участниками сборной по физкультуре), а также со всеми другими людьми, не прошедшими на всерос (то есть, из всех возможных людей, они готовы терпеть только всероссников по химии).
  2.  
  3. К счастью, пока кроме химиков ещё никто не успел купить билеты на поезд, так что всё, что нужно обеспечить руководителю, это чтобы после покупки билетов, в вагонах, в которых поедут участники сборной по информатике не осталось свободных мест (тогда там точно не поедут посторонние).
  4.  
  5. Но у руководителя есть и свои ограничения — он хочет, чтобы вагонов, в которых поедут его подопечные, было как можно меньше и они шли подряд (при этом допускается, чтобы между ними были целиком занятые вагоны).
  6.  
  7. Помогите руководителю сборной выбрать, в каких вагонах информатики поедут на олимпиаду, или определите, что это невозможно.
  8.  
  9. Входные данные
  10. В первой строке дано два целых числа n и k (1≤n≤105,1≤k≤109) — число вагонов и участников сборной соответственно.
  11.  
  12. Во второй строке даны n целых чисел ai (0≤ai≤109) — количество свободных мест в вагонах.
  13.  
  14. Гарантируется, что суммарное число свободных мест в поезде не превосходит 109.
  15.  
  16. Выходные данные
  17. Выведите два целых числа — номера первого и последнего вагона, в которых поедут участники сборной.
  18.  
  19. Если же купить билеты, соблюдая все требования, невозможно, выведите -1.*/
  20.  
  21. #include <iostream>
  22. #include <queue>
  23.  
  24. int main()
  25. {
  26.     int n, k;
  27.     std::cin >> n >> k;
  28.    
  29.     int* pn = new int[n];
  30.    
  31.     for (int i = 0; i < n; i++)
  32.         std::cin >> pn[i];
  33.    
  34.     int sum = 0, ptr = 0, best_s, best_f, best_l = n + 1;
  35.    
  36.     std::queue<int> que;
  37.    
  38.     while (ptr < n)
  39.     {
  40.         if (sum < k)
  41.         {
  42.             sum += pn[ptr];
  43.             que.push(ptr++);
  44.         }
  45.         else if (sum > k)
  46.         {
  47.             sum -= pn[que.front()];
  48.             que.pop();
  49.         }
  50.         else
  51.         {
  52.             if (que.back() - que.front() < best_l)
  53.             {
  54.                 best_l = que.back() - que.front();
  55.                 best_s = que.front();
  56.                 best_f = que.back();
  57.             }
  58.             sum -= pn[que.front()];
  59.             que.pop();
  60.         }
  61.        
  62.     }
  63.    
  64.     if (sum > k)
  65.     {
  66.         while (sum > k)
  67.         {
  68.             sum -= pn[que.front()];
  69.             que.pop();
  70.         }
  71.     }
  72.    
  73.     if (sum == k )
  74.     {
  75.         if (que.back() - que.front() < best_l)
  76.         {
  77.             best_l = que.back() - que.front();
  78.             best_s = que.front();
  79.             best_f = que.back();
  80.         }
  81.     }
  82.    
  83.     best_l != n + 1 ? std::cout << best_s + 1 << " " << best_f + 1 : std::cout << -1;
  84.    
  85.     delete[] pn;
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement