Advertisement
1WaKa_WaKa1

Task_I

Apr 24th, 2022 (edited)
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <algorithm>
  5. #include <list>
  6.  
  7. using namespace std;
  8.  
  9. struct car {
  10.     int type;
  11.     int queueNumber;
  12.     bool operator==(const car& first) const{
  13.         return first.type==type;
  14.     };
  15. };
  16.  
  17. bool isBigger (car car1, car car2){
  18.     return car1.queueNumber > car2.queueNumber;
  19. }
  20.  
  21. bool sortCars(car car1, car car2){
  22.     if (car1.type < car2.type){
  23.         return isBigger(car1, car2);
  24.     } else return isBigger(car2, car1);
  25. }
  26.  
  27. int main() {
  28.  
  29.     //Ввод данных
  30.     int n, k, p;
  31.     int answer = 0;
  32.     cin >> n >> k >> p;
  33.     vector<car> floor;
  34.     vector<int> subsequenceOfCars;
  35.     vector<car> cars;
  36.     map <int, bool> carsOnFloor;
  37.     map <int, int> isCarsInUse;
  38.  
  39.     for (int i = 1; i <= k; i++){
  40.         carsOnFloor.insert(make_pair(i, false));
  41.         isCarsInUse.insert(make_pair(i,0));
  42.     }
  43.  
  44.     for (int i = 1; i <= p; i++){
  45.         int temp;
  46.         cin >> temp;
  47.         subsequenceOfCars.push_back(temp);
  48.         if (floor.empty() || (!carsOnFloor[temp] && floor.size() < k)){
  49.             floor.push_back(car{temp, i});
  50.             carsOnFloor[temp] = true;
  51.             answer+=1;
  52.         }
  53.         else {
  54.             isCarsInUse[temp] +=1;
  55.             cars.push_back(car{temp, i});
  56.         }
  57.     }
  58.  
  59.     sort(floor.begin(), floor.end(), isBigger);
  60.     sort(cars.begin(), cars.end(), sortCars);
  61.     //Тело программы
  62.     for (int i = 0; i < subsequenceOfCars.size(); i++){
  63.         if (carsOnFloor[subsequenceOfCars[i]]){
  64.             auto temp = find(floor.begin(), floor.end(), cars[i]) - floor.begin();
  65.             for (int j = 0; j < cars.size(); j++) {
  66.                 if (cars[j].type == subsequenceOfCars[i]){
  67.                     if ((cars.begin() + j+1) != cars.end() && (cars.begin() + (j+1))->type == (cars.begin() + (j))->type){
  68.                         (floor.begin()+temp)->queueNumber = (cars.begin() + (j))->queueNumber;
  69.                     }else{
  70.                         (floor.begin()+temp)->queueNumber = (cars.begin() + (j))->queueNumber;
  71.                     }
  72.                     cars.erase(cars.begin() + j);
  73.                     isCarsInUse[subsequenceOfCars[i]] -=1;
  74.                     break;
  75.                 }
  76.             }
  77.             sort(floor.begin(), floor.end(), isBigger);
  78.         } else {
  79.             int index = -1;
  80.             for (int j = 0; j < floor.size(); j++){
  81.                 if (isCarsInUse[floor[j].type] == 0){
  82.                     index = j;
  83.                     break;
  84.                 }
  85.             }
  86.             if (index != -1){
  87.                 carsOnFloor[subsequenceOfCars[i]] = true;
  88.                 carsOnFloor[floor[index].type] = false;
  89.                 floor.erase(floor.begin()+index);
  90.                 for (int j = 0; j < cars.size(); j++) {
  91.                     if (cars[j].type == subsequenceOfCars[i]) {
  92.                         floor.insert(floor.begin(), cars[j]);
  93.                         isCarsInUse[subsequenceOfCars[i]] -= 1;
  94.                         cars.erase(cars.begin() + j);
  95.                         break;
  96.                     }
  97.                 }
  98.                 sort(floor.begin(), floor.end(), isBigger);
  99.                 answer += 1;
  100.             }else {
  101.                 carsOnFloor[subsequenceOfCars[i]] = true;
  102.                 carsOnFloor[floor.front().type] = false;
  103.                 floor.erase(floor.begin());
  104.                 for (int j = 0; j < cars.size(); j++) {
  105.                     if (cars[j].type == subsequenceOfCars[i]) {
  106.                         floor.insert(floor.begin(), cars[j]);
  107.                         isCarsInUse[subsequenceOfCars[i]] -= 1;
  108.                         cars.erase(cars.begin() + j);
  109.                         break;
  110.                     }
  111.                 }
  112.                 sort(floor.begin(), floor.end(), isBigger);
  113.                 answer += 1;
  114.             }
  115.         }
  116.     }
  117.  
  118.     //Вывод
  119.     cout << answer;
  120.  
  121.     return 0;
  122.  
  123. }
  124.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement