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:=currXOR1
当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, ],]