跳转至

5349.安排电影院座位 (Medium)*

题目描述*

电影院的观影厅中有 n 行座位,行编号从 1 到 n ,且每一行内总共有 10 个座位,列编号从 1 到 10 。

给你数组 reservedSeats ,包含所有已经被预约了的座位。比如说,researvedSeats[i]=[3,8] ,它表示第 3 行第 8 个座位被预约了。

请你返回 最多能安排多少个 4 人家庭 。4 人家庭要占据 同一行内连续 的 4 个座位。隔着过道的座位(比方说 [3,3] 和 [3,4])不是连续的座位,但是如果你可以将 4 人家庭拆成过道两边各坐 2 人,这样子是允许的。

提示*

1 <= n <= 10^9, 1 <= reservedSeats.length <= min(10*n, 10^4), reservedSeats[i].length == 2, 1 <= reservedSeats[i][0] <= n, 1 <= reservedSeats[i][1] <= 10

所有 reservedSeats[i] 都是互不相同的。

代码*

题目乍一看好像挺麻烦,再一看感觉挺简单,然后就一顿写。然后就是无限的超时,主要还是没想到直接用 unordered_map<int, unordered_set<int>> 存预订座位,不过这里其实可以直接用一个 unordered_map<int, int> 存每一行的掩码就行了。

关键是本地测试的时候明明最后那个数据跑出来没超时,一提交就超时 cyka blyat!!!

要注意的就是应该从总座位数 2 * n 减去不满足的座位,因为没有预定的行不会记录到 seats。

class Solution {
public:
    int maxNumberOfFamilies(int n, vector<vector<int>>& r) {
        unordered_map<int, int> seats;
        for(auto& i : r) {
            seats[i[0]] |= (1 << i[1]);
        }
        int res = 2 * n;
        for(auto iter = seats.begin(); iter != seats.end(); iter++) {
            int mask = iter->second;
            if((mask & 0x3fc) == 0) {
                continue;
            }else if((mask & 0x3c0) == 0 || (mask & 0x3c) == 0 || (mask & 0xf0) == 0) {
                res -= 1;
            }else {
                res -= 2;
            }
        }
        return res;
    }
};

最后更新: July 23, 2022