C ++中的旋转门

假设我们有一个请求列表,其中requests [i]包含[t,d],指示在时间t,一个人到达门并且想要进入内部(内部使用1表示)或出去(外部表示使用0)。

因此,如果只有一扇门并且使用一个门需要一个时间单位,那么我们必须遵循的规则很少-

  • 门从“进入”位置开始,然后设置为最后一个参与者使用的位置。

  • 如果在给定的时间t只有一个参与者在门口,他们可以使用该门。

  • 如果要参加两个或更多参与者,则最早的参与者将首先参加,然后优先使用先前使用的方向。

  • 如果没有人将门一次性使用,它将恢复为初始状态。

因此,我们必须找到每个元素都包含[t,d]的排序列表,以指示在时间t某个人进入内部或外部。

因此,如果输入类似于[[2,0],[3,1],[6,0],[6,1],[3,0]],则输出将为[[2,0] ,[3,0],[4,1],[6,1],[7,0]]

为了解决这个问题,我们将遵循以下步骤-

  • 对数组v排序

  • 创建一个列表ret

  • curr:= 1,i:= 0,j:= 0

  • n:= v的大小

  • 当我<n时,请执行以下操作:

    • curr:= v [i,1]

    • 当arr [curr]不为零时,请将arr [curr]每减少一个,执行-

    • 在ret的末尾插入{t,curr}

    • (将t增加1)

    • 当arr [curr]不为零时,请将arr [curr]每减少一个,执行-

    • curr:= curr XOR 1

    • 当arr [curr]不为零时,请将arr [curr]每减少一个,执行-

    • 在ret的末尾插入{t,curr}

    • (将t增加1)

    • 在ret的末尾插入{t,curr}

    • (将t增加1)

    • (将arr [v [j,1]]增大1)

    • curr:= 1

    • 如果ret不为空并且v [i,0]-ret的最后一个元素的t> 1,则:

    • j:= i + 1

    • 定义大小为2的数组arr

    • (将arr [v [i,1]]增大1)

    • 而(j <n和v [j,0]与v [i,0]相同),则执行-

    • t:=的最大值(如果ret为空,则为0,否则为ret的最后一个元素的t)和v [i,0]

    • 如果arr [1]为非零且arr [0]为非零,则-

    • 除此以外

    • curr:= ret的最后一个元素的方向

    • i:= j

    • 返回ret

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    void print_vector(vector<vector<auto>> v) {
       cout << "[";
       for (int i = 0; i < v.size(); i++) {
          cout << "[";
          for (int j = 0; j < v[i].size(); j++) {
             cout << v[i][j] << ", ";
          }
          cout << "],";
       }
       cout << "]" << endl;
    }
    class Solution {
       public:
       vector<vector<int>> solve(vector<vector<int>>& v) {
          sort(v.begin(), v.end());
          vector < vector <int > > ret;
          int curr = 1;
          int i = 0;
          int j = 0;
          int n = v.size();
          while(i < n){
             if(!ret.empty() && v[i][0] - ret.back()[0] > 1){
                curr = 1;
             }
             j = i + 1;
             vector <int> arr(2);
             arr[v[i][1]]++;
             while(j < n && v[j][0] == v[i][0]){
                arr[v[j][1]]++;
                j++;
             }
             int t = max((ret.empty()? 0 : ret.back()[0] + 1), v[i][0]);
             if(arr[1] && arr[0]){
                while(arr[curr]--){
                   ret.push_back({t, curr});
                   t++;
                }
                curr = curr ^ 1;
                while(arr[curr]--){
                   ret.push_back({t, curr});
                   t++;
                }
             }else{
                curr = v[i][1];
                while(arr[curr]--){
                   ret.push_back({t, curr});
                   t++;
                }
             }
             curr = ret.back()[1];
             i = j;
          }
          return ret;
       }
    };
    int main(){
       vector<vector<int>> v = {{2, 0},{3, 1},{6, 0},{6, 1},{3, 0}};
       Solution ob;
       print_vector(ob.solve(v));
    }

    输入值

    {{2, 0},{3, 1},{6, 0},{6, 1},{3, 0}}

    输出结果

    [[2, 0, ],[3, 0, ],[4, 1, ],[6, 1, ],[7, 0, ],]