Advertisement
-Peer-

Групповая выборка свободных мест в кинотеатре методом пр…

Aug 26th, 2019
739
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.34 KB | None | 0 0
  1. //  ГРУППОВАЯ  ВЫБОРКА  СВОБОДНЫХ  МЕСТ  В  КИНОТЕАТРЕ  МЕТОДОМ  ПРОВЕШИВАНИЯ
  2.  
  3. /*
  4.  
  5. В кинотеатре n рядов по m мест в каждом (n и m не превосходят 20).
  6. В двумерном массиве хранится информация о проданных билетах, число 1 означает, что билет на данное место уже продан, число 0 означает, что место свободно.
  7. Поступил запрос на продажу k билетов на соседние места в одном ряду.
  8. Определите, можно ли выполнить такой запрос.
  9.  
  10. Формат входных данных
  11.  
  12. Программа получает на вход числа n и m.
  13. Далее идет n строк, содержащих m чисел (0 или 1), разделенных пробелами.
  14. Затем дано число k.
  15.  
  16. Формат выходных данных
  17.  
  18. Программа должна вывести номер ряда, в котором есть k подряд идущих свободных мест.
  19. Если таких рядов несколько, то выведите номер наименьшего подходящего ряда.
  20. Если подходящего ряда нет, выведите число 0.
  21.  
  22. */
  23.  
  24.  
  25. // РЕШЕНИЕ МЕТОДОМ ПРОВЕШИВАНИЯ
  26.  
  27. #include <iostream>
  28. #include <vector>
  29. using namespace std;
  30.  
  31. const int DIM = 21; // ограничитель размеров массива — не более 20 по 20
  32.  
  33. int main ()
  34. {
  35.     int i, j, k, m, n;
  36.    
  37. // ВВОД РАЗМЕРОВ МАССИВА
  38.     cin >> n >> m;
  39.    
  40.     if (n > 0 && n < DIM && m > 0 && m < DIM) // проверка границ массива
  41.         {
  42.             vector <vector <bool>> tic (n);
  43.             for (i = 0; i < n; i++) // заполнение массива
  44.                 {
  45.                     tic[i].resize (m);
  46.                     for (j = 0; j < m; j++)
  47.                         {
  48.                             cin >> k; // 0 либо 1?
  49.                             tic[i][j] = (bool)k; // чистая формальность
  50.                         }
  51.                 }
  52.                
  53.             cin >> k; // собственно размер запроса
  54.            
  55.             if (k <= m)   // если k > m, то заказ неисполним!
  56.                 {
  57.                     const int dif = m - k; // кол–во вариантов выбора k мест подряд в ряду из m мест
  58.                     for (i = 0; i < n; i++) // цикл по всем рядам…
  59.                         {
  60.                             j = 0;
  61.                             while (j <= dif) // поиск внутри ряда…
  62.                                 {
  63.                                     bool Hit = true;
  64.                                     for (int jk = j + k; (j < jk) && Hit; j++) // попытка провешивания…
  65.                                         {
  66.                                             Hit = !(tic[i][j]); // условие успешного провешивания
  67.                                         }
  68.                                     if (Hit)
  69.                                         {
  70.                                             cout << (++i); // номер ряда на 1 больше индекса!
  71.                                             return 0; // преждевременный выход из программы в случае успеха
  72.                                         }
  73.                                 }
  74.                         }
  75.                 }
  76.         }
  77.     cout << 0; // сюда попадаем в случае неудачи по всем рядам
  78.     return 0;
  79. }
  80.  
  81. /*
  82.        _ПОЯСНЕНИЕ_
  83.  
  84.  •  ПРОВЕШИВАНИЕ — измерение расстояний на местности при помощи ВЕХИ — шеста заранее известной длины.
  85. ✓ В данной программе «веха» — конечная непрерывная выборка (последовательность) зрительских мест, число которых определяется заказом. Провешивание осуществляется формированием вехи и последующей проверкой состояния каждого из мест в пределах выбранной вехи.
  86.  
  87.  
  88.        _ПОДСКАЗКА_    
  89.  
  90.    ✓ Непрерывную выборку из Κ мест в ряду, в котором всего Μ мест, при условии, что Κ ≤ Μ, можно сделать Μ – Κ + 1 способом. Это и есть максимальное число провешиваний в пределах одного ряда.
  91.  
  92.  
  93. Например:
  94. •  при Κ == Μ решение единственное — занять все места в ряду,
  95. •  при Κ == Μ – 1 решений 2: Κ мест в начале ряда или Κ мест в конце ряда,
  96. •  при Κ == Μ – 2 вариантов 3: в начале, в конце или точно посередине.
  97. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement