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 };
  • 相关阅读:
    使用Eclipse+axis2一步一步发布webservice
    python学习-- django 2.1.7 ajax 请求
    python学习-- Django传递数据给JS
    python学习-- {% csrf_token %}
    python学习-- 两种方式查看自己的Django版本
    python学习-- 默认urls中 Path converter
    Django--------问题:在terminal命令行创建超级用户时入到password时输入为什么没有反应?
    python学习-- 数据库迁移 python manage.py makemigrations 和 python manage.py migrate
    python学习-- Django根据现有数据库,自动生成models模型文件
    python学习-- Django model -class 主键自增问题
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13288056.html
Copyright © 2011-2022 走看看