zoukankan      html  css  js  c++  java
  • 1386. Cinema Seat Allocation

    问题:

    给定一个有n排,每排10个位置的影院,已被预订座位列表。

    求一个4人组要定在连续相邻座位的可能性有多少种。

    其中对过道(3和4之间,7和8之间),将其中一个人分开的话,不算满足相邻条件。

    Example 1:
    Input: n = 3, reservedSeats = [[1,2],[1,3],[1,8],[2,6],[3,1],[3,10]]
    Output: 4
    Explanation: The figure above shows the optimal allocation for four groups, where seats mark with blue are already reserved and contiguous seats mark with orange are for one group.
    
    Example 2:
    Input: n = 2, reservedSeats = [[2,1],[1,8],[2,6]]
    Output: 2
    
    Example 3:
    Input: n = 4, reservedSeats = [[4,3],[1,4],[4,6],[1,7]]
    Output: 4
     
    
    Constraints:
    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
    All reservedSeats[i] are distinct.
    

      

    解法:

    使用bit标记法,

    对每一排标记为 0b 000 0000 000

    的一个二进制数。

    使用unordered_map<int,int> Seats//key:row;value:每行座位状况

    来保存被预订后的影院座位状况。

    若已被预订,则那一位被标记为1

    Seats[row:i] |= (1<<reservedSeats[row:i][col])

    遍历 reservedSeats,更新 Seats 中所有被预定的位置

    然后再遍历 Seats

    若当前排的状态

    1.满足 011 1111 110 这些1的位置上,为0(即未被占)

    那么,有2种可能的选择。

    2.满足 011 1100 000 这些1的位置上,为0(即未被占)

    那么,有1种可能的选择。

    3.满足 000 0011 110 这些1的位置上,为0(即未被占)

    那么,有1种可能的选择。

    4.满足 000 1111 000 这些1的位置上,为0(即未被占)

    那么,有1种可能的选择。

    把所有可能累加 res。

    再加上整排未被占用的情况

    有n-Seats.size()排未被占用。

    这样的每一排,有2中可能。

    因此,最终结果=res+2*(n-Seats.size())

    ⚠️ 注意:

    1.位操作运算 和判断符号==的优先度,==更高,

    因此注意需要位运算的话,记得加括号。

    2.二进制表示:0b

    八进制表示:0

    十六进制表示:0x

    ♻️ 优化:由于不考虑位置1和位置10,(如果要选择这两个位置,4人组必定不能连续,不满足题意)

    所需判断的有效位仅为2~9,共8位,因此可简化int->char,节省空间。即:

    unordered_map<int,char> Seats;

    代码参考:

     1 class Solution {
     2 public:
     3     int maxNumberOfFamilies(int n, vector<vector<int>>& reservedSeats) {
     4         //start:2,4,6
     5         int res=0;
     6         unordered_map<int,int> Seats;
     7         for(vector<int> seat:reservedSeats){
     8             Seats[seat[0]-1] |= (1<<(seat[1]-1));
     9         }
    10         for(auto row:Seats){
    11             int cout=0;
    12             if((row.second & 0b0111100000) == 0) cout+=1;
    13             if((row.second & 0b0000011110) == 0) cout+=1;
    14             if(cout==0 && (row.second & 0b0001111000) == 0) cout=1;
    15             res+=cout;
    16         }
    17         return (n-Seats.size())*2+res;
    18     }
    19 };
  • 相关阅读:
    【Vijos1067】守望者的烦恼【矩阵乘法】
    【Vijos1067】守望者的烦恼【矩阵乘法】
    【洛谷P3514】LIZ-Lollipop【思维】【模拟】
    【洛谷P3514】LIZ-Lollipop【思维】【模拟】
    【CF617E】XOR and Favorite Number【莫队】
    【CF617E】XOR and Favorite Number【莫队】
    【牛客练习赛46-A】华华教奕奕写几何【二分】
    【牛客练习赛46-A】华华教奕奕写几何【二分】
    【洛谷P1494】【BZOJ2038】小Z的袜子【莫队】
    【洛谷P1494】【BZOJ2038】小Z的袜子【莫队】
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13288056.html
Copyright © 2011-2022 走看看