Advertisement
edward4324

laba po yampu 18

Apr 6th, 2021
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.56 KB | None | 0 0
  1. //задача 18
  2.  
  3. #include <iostream>
  4. #include <Windows.h>
  5. #include <string>
  6. #include <vector>
  7. #include <algorithm>
  8. using namespace std;
  9.  
  10. const int startTime = 0;
  11. int endTime;
  12. int length;
  13.  
  14. vector<vector<int>> combinations;
  15. vector<vector<int>> good;
  16. vector<int> combo;
  17.  
  18. vector<vector<int>> table;
  19.  
  20. bool
  21. condition_a(vector<vector<int>>* unsafe_int);
  22.  
  23. bool
  24. condition_a(vector<vector<int>> table_t);
  25.  
  26. void
  27. condition_B(vector<vector<int>>* unsafe_int);
  28.  
  29. void print_B(vector<vector<int>> print_v);
  30.  
  31. vector<vector<int>>
  32. condition_V(vector<vector<int>>* unsafe_int);
  33.  
  34. void print_V(vector<vector<int>> print_v);
  35.  
  36. vector<int>
  37. getFilled(vector<int> lens);
  38.  
  39. void
  40. print(vector<vector<int>> table);
  41.  
  42. void
  43. f(vector<int> lens);
  44.  
  45. int main() {
  46.  
  47.     SetConsoleCP(1251);
  48.     SetConsoleOutputCP(1251);
  49.  
  50.     table.resize(2);
  51.     ////////////////////////////
  52.     //ввод ключевых значений
  53.     int N;
  54.  
  55.     cout << "Введите количество сторожей: ";
  56.     cin >> N;
  57.  
  58.     int input;
  59.  
  60.     for (int i = 0; i < N; i++) {
  61.  
  62.         cout << "Введите интервалы для сторожа №:" << i + 1 << endl;
  63.         cin >> input;
  64.         table.at(0).push_back(input);
  65.         cin >> input;
  66.         table.at(1).push_back(input);
  67.         system("cls");
  68.     }
  69.  
  70.     cout << "Введите продолжительность дежурства дополнительных сторожей: ";
  71.     cin >> length;
  72.  
  73.     cout << "Введите время окончания дежурства сторожей: ";
  74.     cin >> endTime;
  75.  
  76.     //конец ввода значений
  77.     ////////////////////////////
  78.    
  79.     cout << "Идет проверка введенных даннных..." << endl;
  80.  
  81.     ////////////////////////////
  82.     //условие а
  83.     //
  84.     //создание вектора для регистрации небезопасных периодов работы сторожей
  85.     vector<vector<int>>* uns_periods = new vector<vector<int>>;
  86.     uns_periods->resize(2);
  87.     uns_periods->at(0).resize(endTime);
  88.     uns_periods->at(1).resize(endTime);
  89.     for (int i = 0; i < endTime; i++) {
  90.  
  91.         uns_periods->at(0)[i] = i;
  92.         uns_periods->at(1)[i] = 0;
  93.     }
  94.  
  95.     bool proverka = condition_a(uns_periods);
  96.  
  97.     if (proverka) {
  98.  
  99.         cout << "Да" << endl;
  100.  
  101.         cout << "Расписание сторожей: " << endl;
  102.  
  103.         for (int i = 0; i < table.at(0).size(); i++) {
  104.  
  105.            cout << "Сторож №" << i + 1
  106.                 << "\n\tНачало смены: " << table.at(0)[i]
  107.                 << "\tКонец смены: " << table.at(1)[i]
  108.                 << "\t\n";
  109.  
  110.         }
  111.  
  112.     }
  113.     //конец условия А
  114.     //////////////////////////////
  115.  
  116.     ////////////////////////////
  117.     //условие Б
  118.     else {
  119.  
  120.         cout << "Нет" << endl;
  121.  
  122.         cout << "Информация о проблемных временных промежутках:" << endl;
  123.                
  124.         condition_B(uns_periods);
  125.  
  126.     }
  127.     //конец условия Б
  128.     ////////////////////////////
  129.  
  130.     while (true) {
  131.  
  132.         cout << "Выберите действие" << endl;
  133.         cout << "1 - проверка условия В, 2 - проверка условия Г, 3 - проверка условия Д" << endl;
  134.         int choose;
  135.         cin >> choose;
  136.         switch (choose) {
  137.  
  138.         case 1:
  139.  
  140.             ////////////////////////////
  141.             //улосвие В
  142.  
  143.             condition_V(uns_periods);
  144.  
  145.             //конец условия В
  146.             ////////////////////////////
  147.  
  148.             break;
  149.  
  150.         case 2: {
  151.  
  152.             ////////////////////////////
  153.             //условие Г
  154.  
  155.             vector<int> lens;
  156.             for (int i = 0; i < table[0].size(); i++)
  157.                 lens.push_back(table[1][i] - table[0][i]);
  158.  
  159.             vector<int> var = getFilled(lens);
  160.             vector<int> temp;
  161.             f(lens);
  162.  
  163.             sort(combinations.begin(), combinations.end(), [](vector<int> first, vector<int> second) {
  164.                 return first.size() > second.size();
  165.                 }
  166.             );
  167.  
  168.             for (int i = 0; i < combinations.size(); i++)
  169.             {
  170.                 bool ifGood = true;
  171.                 vector<int> filled = getFilled(combinations[i]);
  172.                 for (int j = 0; j < endTime && ifGood; j++)
  173.                     if (filled[j] < 2)
  174.                         ifGood = false;
  175.  
  176.                 if (ifGood)
  177.                     good.push_back(combinations[i]);
  178.             }
  179.  
  180.             if (!good.empty()) {
  181.                 cout << "Да, такое расписание составить возможно:" << endl;
  182.             }
  183.             else
  184.                 cout << "Подобное расписание составить невозможно" << endl;
  185.             //конец условий Г
  186.             //////////////////////////////
  187.         }
  188.               break;
  189.  
  190.         case 3: {
  191.  
  192.             ////////////////////////////
  193.             //условие Д
  194.  
  195.             vector<int> lens;
  196.             for (int i = 0; i < table[0].size(); i++)
  197.                 lens.push_back(table[1][i] - table[0][i]);
  198.  
  199.             vector<int> var = getFilled(lens);
  200.             vector<int> temp;
  201.             f(lens);
  202.  
  203.             sort(combinations.begin(), combinations.end(), [](vector<int> first, vector<int> second) {
  204.                 return first.size() > second.size();
  205.                 }
  206.             );
  207.  
  208.             for (int i = 0; i < combinations.size(); i++)
  209.             {
  210.                 bool ifGood = true;
  211.                 vector<int> filled = getFilled(combinations[i]);
  212.                 for (int j = 0; j < endTime && ifGood; j++)
  213.                     if (filled[j] < 2)
  214.                         ifGood = false;
  215.  
  216.                 if (ifGood)
  217.                     good.push_back(combinations[i]);
  218.             }
  219.  
  220.             if (!good.empty()) {
  221.                 cout << "Да, такое расписание составить возможно:" << endl;
  222.  
  223.                 cout << "До: " << endl;
  224.                 print(table);
  225.  
  226.                 vector<int> best_combo;
  227.                 int min_changes = INT_MAX;
  228.                 for (int i = 0; i < good.size(); i++)
  229.                 {
  230.                     int changes = 0;
  231.                     for (int j = 0; j < good[i].size(); j++)
  232.                         if (good[i][j] != lens[j])
  233.                             changes++;
  234.                     if (changes < min_changes)
  235.                         min_changes = changes, best_combo = good[i];
  236.                 }
  237.  
  238.                 vector<vector<int>> guardsTime(2);
  239.                 vector<int> filling(endTime, 0);
  240.  
  241.                 vector<vector<int>> table_copy(table);
  242.                 int pos = 0;
  243.                 while (!table[0].empty())
  244.                 {
  245.                     for (int j = 0; j < best_combo.size(); j++)
  246.                     {
  247.                         for (int i = 0; i < table[0].size(); i++)
  248.                         {
  249.                             if (table[1][i] - table[0][i] == best_combo[j])
  250.                             {
  251.                                 while (filling[pos] >= 2)
  252.                                 {
  253.                                     if (pos == filling.size())
  254.                                     {
  255.                                         pos = 0;
  256.                                         break;
  257.                                     }
  258.                                     else
  259.                                         pos++;
  260.                                 }
  261.                                 guardsTime[0].push_back(pos);
  262.                                 guardsTime[1].push_back(pos + table[1][i] - table[0][i]);
  263.                                 for (int j = 0; j < table[1][i] - table[0][i]; j++)
  264.                                     filling[pos++]++;
  265.                                 pos = 0;
  266.                                 table[0].erase(table[0].begin() + i);
  267.                                 table[1].erase(table[1].begin() + i);
  268.                                 best_combo.erase(best_combo.begin() + j);
  269.                                 j--;
  270.                                 break;
  271.                             }
  272.                         }
  273.                     }
  274.                 }
  275.                 cout << endl << "После: " << endl;
  276.                 print(guardsTime);
  277.                 cout << endl;
  278.  
  279.                 for (int i = 0; i < table_copy[0].size(); i++)
  280.                 {
  281.                     if (guardsTime[0][i] != table_copy[0][i] || guardsTime[1][i] != table_copy[1][i])
  282.                     {
  283.                         for (int j = guardsTime[0].size() - 1; j > 0; j--)
  284.                         {
  285.                             if (guardsTime[1][j] - guardsTime[0][j] == table_copy[1][i] - table_copy[0][i])
  286.                             {
  287.                                 cout << "Сторож #" << i + 1 << " поменялся местами с #" << j + 1 << " с [" << table_copy[0][i] << ":" << table_copy[1][i] << "] на [" << guardsTime[0][j] << ":" << guardsTime[1][j] << "]" << endl;
  288.                                 break;
  289.                             }
  290.                         }
  291.                     }
  292.                 }
  293.                 cout << endl << "Количество перестановок" << min_changes;
  294.  
  295.                 table = table_copy;
  296.             }
  297.             else
  298.                 cout << "Подобное расписание составить невозможно" << endl;
  299.             //конец условий Д
  300.             //////////////////////////////
  301.  
  302.             break;
  303.         }
  304.  
  305.         default: {
  306.  
  307.             cout << "Неправильный ввод, для выбора введите цифру от 1 до 3" << endl;
  308.             Sleep(4);
  309.             break;
  310.         }
  311.         }
  312.  
  313.         cout << "Хотите заврешить работу программы?" << endl;
  314.         cout << "1 - да, 2 - нет" << endl;
  315.  
  316.         int stop;
  317.         cin >> stop;
  318.         if (stop == 1)
  319.             return 0;
  320.  
  321.     }
  322.     return 0;
  323.  
  324. }
  325.  
  326. //условие a
  327. bool
  328. condition_a (vector<vector<int>>* unsafe_int) {
  329.  
  330.     bool result = condition_a(table);
  331.  
  332.     if (!result) {
  333.  
  334.         for (int i = 0; i < table[0].size(); i++) {
  335.  
  336.             for (int j = table[0][i]; j < table[1][i]; j++)
  337.                 unsafe_int->at(1)[j]++;
  338.  
  339.         }
  340.  
  341.         for (int i = 0; i < endTime; i++)
  342.             if (unsafe_int->at(1)[i] < 2)
  343.                 return false;
  344.  
  345.     }
  346.  
  347.     else
  348.         return result;
  349.  
  350. }
  351.  
  352. //перегрузка для того, чтобы можно было проверять работу условия в пункте В
  353. bool
  354. condition_a(vector<vector<int>> table_t) {
  355.  
  356.     int** check = new int* [2];
  357.     check[0] = new int[endTime];
  358.     check[1] = new int[endTime];
  359.     for (size_t i = 0; i < endTime; i++) {
  360.  
  361.         check[0][i] = i;
  362.         check[1][i] = 0;
  363.  
  364.     }
  365.  
  366.     for (int i = 0; i < table_t[0].size(); i++) {
  367.  
  368.         for (int j = table_t[0][i]; j < table_t[1][i]; j++)
  369.             check[1][j]++;
  370.  
  371.     }
  372.  
  373.     for (int i = 0; i < endTime; i++)
  374.         if (check[1][i] < 2)
  375.             return false;
  376.            
  377.     return true;
  378.  
  379. }
  380.  
  381. //условие Б
  382.  
  383. void
  384. condition_B(vector<vector<int>>* unsafe_int) {
  385.  
  386.     int period_start = 0;
  387.     int count = 0;
  388.  
  389.     vector<vector<int>> result;
  390.     result.resize(2);
  391.  
  392.     int i = 0;
  393.  
  394.     while (i < unsafe_int->at(0).size() - 1) {
  395.  
  396.         if (unsafe_int->at(1)[i] < 2) {
  397.  
  398.             period_start = unsafe_int->at(0)[i];
  399.  
  400.             while (unsafe_int->at(1)[i] < 2 && i < unsafe_int->at(0).size() - 1) {
  401.  
  402.                 count++;
  403.                 i++;
  404.  
  405.             }
  406.  
  407.             result[0].push_back(period_start);
  408.             result[1].push_back(period_start + 1 + count);
  409.         }
  410.  
  411.         i++;
  412.  
  413.     }
  414.  
  415.     print_B(result);
  416.  
  417. }
  418.  
  419. void
  420. print_B(vector<vector<int>> print_v) {
  421.  
  422.     for (int i = 0; i < print_v[0].size(); i++) {
  423.  
  424.         cout << "Недостаточно охраняемый период времени № " << i + 1 << endl;
  425.         cout << "Начало: " << print_v[0][i] << endl;
  426.         cout << " Конец: " << print_v[1][i] << endl;
  427.     }
  428.  
  429. }
  430.  
  431. //условие В
  432. vector<vector<int>>
  433. condition_V(vector<vector<int>> *unsafe_int) {
  434.  
  435.     /*vector<vector<int>> temp;
  436.     vector<vector<int>> additional;
  437.  
  438.     additional.resize(2);
  439.  
  440.     temp = table;
  441.     int N = table[0].size();
  442.  
  443.     for (int i = 0; i < unsafe_int->at(0).size(); i++) {
  444.  
  445.         if(unsafe_int->at(1)[i] <= 1) {
  446.  
  447.             if (unsafe_int->at(0)[i] + length <= endTime) {
  448.                 temp[0].push_back(unsafe_int->at(0)[i]);
  449.                 temp[1].push_back(unsafe_int->at(0)[i] + length);
  450.                 additional[0].push_back(unsafe_int->at(0)[i]);
  451.                 additional[1].push_back(unsafe_int->at(0)[i] + length);
  452.             }
  453.             else {
  454.                 temp[0].push_back(endTime - length);
  455.                 temp[1].push_back(endTime);
  456.                 additional[0].push_back(endTime - length);
  457.                 additional[1].push_back(endTime);
  458.             }
  459.             if (condition_a(temp)) {
  460.                 print_V(additional);
  461.                 return temp;
  462.             }
  463.  
  464.         }
  465.  
  466.     }*/
  467.  
  468.     vector<vector<int>> additional;
  469.     additional.resize(2);
  470.  
  471.     vector<vector<int>> check;
  472.     check.resize(2);
  473.     check[0].resize(endTime);
  474.     check[1].resize(endTime);
  475.     for (int i = 0; i < endTime; i++) {
  476.         check[0][i] = i + 1;
  477.         check[1][i] = 0;
  478.     }
  479.  
  480.     vector<vector<int>> temp;
  481.  
  482.     int start;
  483.     int end;
  484.  
  485.     temp = table;
  486.    
  487.     while (!condition_a(temp)) {
  488.         //формирование массива с небезопасными участками
  489.         for (int i = 0; i < temp[0].size(); i++) {
  490.  
  491.             for (int j = temp[0][i]; j < temp[1][i]; j++)
  492.                 check[1][j]++;
  493.  
  494.         }
  495.  
  496.         int k = 0;
  497.  
  498.         while (k < endTime) {
  499.  
  500.             if (check[1][k] < 2) {
  501.  
  502.                 if (k + length <= endTime) {
  503.  
  504.                     temp[0].push_back(k);
  505.                     temp[1].push_back(k + length);
  506.                     additional[0].push_back(k);
  507.                     additional[1].push_back(k + length);
  508.  
  509.                 }
  510.                 else if (endTime - length > 0){
  511.  
  512.                     temp[0].push_back(endTime - length);
  513.                     temp[1].push_back(endTime);
  514.                     additional[0].push_back(endTime - length);
  515.                     additional[1].push_back(endTime);
  516.  
  517.                 }
  518.  
  519.                 if (k + length < endTime)
  520.                     k += length;
  521.                 else
  522.                     k = endTime;
  523.  
  524.             }
  525.             else
  526.                 k++;
  527.  
  528.         }
  529.  
  530.     }
  531.  
  532.     print_V(additional);
  533.  
  534.     return temp;
  535.  
  536. }
  537.  
  538. void
  539. print_V(vector<vector<int>> print_v) {
  540.  
  541.     for (int i = 0; i < print_v[0].size(); i++) {
  542.  
  543.         cout << "Дополнительный сторож №" << i+1 << endl;
  544.         cout << "Начало смены: " << print_v[0][i] << endl;
  545.         cout << "Конец смены: " << print_v[1][i] << endl;
  546.     }
  547.  
  548. }
  549.  
  550. //условие г (объединённое с д ибо задание без объединения не имеет смысла))
  551.  
  552. vector<int>
  553. getFilled(vector<int> lens)
  554. {
  555.     vector<int> filled(24, 0);
  556.  
  557.     size_t pos = 0;
  558.     for (int i = 0; i < lens.size(); i++)
  559.     {
  560.         while (filled[pos] >= 2)
  561.         {
  562.             if (pos == filled.size())
  563.             {
  564.                 pos = 0;
  565.                 break;
  566.             }
  567.             else
  568.                 pos++;
  569.         }
  570.         if (pos + lens[i] < filled.size())
  571.             for (int j = 0; j < lens[i]; j++)
  572.                 filled[pos++]++;
  573.         pos = 0;
  574.     }
  575.     return filled;
  576. }
  577.  
  578. void
  579. print(vector<vector<int>> table)
  580. {
  581.     for (int i = 0; i < table[0].size(); i++)
  582.     {
  583.         for (int j = startTime; j < table[0][i]; j++)
  584.             cout << "-";
  585.         for (int j = table[0][i]; j < table[1][i]; j++)
  586.             cout << "=";
  587.         for (int j = table[1][i]; j < endTime; j++)
  588.             cout << "-";
  589.         cout << endl;
  590.     }
  591. }
  592.  
  593. void
  594. f(vector<int> lens)
  595. {
  596.     do {
  597.         combinations.push_back(lens);
  598.     } while (next_permutation(lens.begin(), lens.end()));
  599. }
  600. // :)
  601.  
  602. //пример ввода для работы со всеми функциями
  603. 5
  604. 0 4
  605. 4 8
  606. 4 16
  607. 0 12
  608. 0 8
  609. 4
  610. 20
  611.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement