Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Cửa quay trong C++


Cho danh sách yêu cầu requests[i] = [t, d], trong đó t là thời điểm đến, d là hướng: 1 (vào) hoặc 0 (ra). Cửa chỉ cho một người qua mỗi đơn vị thời gian, bắt đầu ở trạng thái "vào". Các quy tắc:

  • Cửa lấy hướng của người cuối cùng sử dụng.
  • Nếu chỉ một người chờ tại thời điểm t, người đó qua cửa.
  • Nếu nhiều người muốn cùng hướng, người đến sớm hơn ưu tiên; nếu hướng khác nhau, hướng trước đó ưu tiên.
  • Nếu cửa không ai dùng trong 1 đơn vị thời gian, quay về trạng thái "vào".

Cần trả về danh sách [t, d] của những người thực sự qua cửa.

Ví dụ: [[2,0],[3,1],[6,0],[6,1],[3,0]] → [[2,0],[3,0],[4,1],[6,1],[7,0]].

Ví dụ

#include <bits/stdc++.h>
using namespace std;

void print_vector(vector<vector<int>> 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, i = 0, j = 0, 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 ^= 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));
}

Đầu vào

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

Đầu ra

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