使用 C++ 判断给定到达和离开时间是否可以进行 k 次预订


在这个问题中,我们得到了两个包含 N 个值的数组,分别表示酒店的到达和离开时间,以及一个整数 k。我们的任务是判断给定到达和离开时间是否可以进行 k 次预订。

问题描述:我们需要检查拥有 k 个房间的酒店是否能够容纳所有到达和离开的客人。

让我们来看一个例子来理解这个问题:

输入:到达时间:{1 4 5 7}

离开时间:{3 5 6 9}
k = 1

输出:

解决方案

为了解决这个问题,我们将酒店的到达和离开时间存储在一个辅助数组中,并标记其是到达还是离开。然后对这个数组进行排序,并计算酒店活跃预订的数量。

如果是到达,计数++
如果是离开,计数--。

如果在任何时间点预订数量超过 k,则返回false,否则返回true

程序示例:

示例

在线演示

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

bool isBookingValid(int arrival[], int departure[], int n, int k){
   
   vector<pair<int, int> > auxArray;
   int activeBookings = 0, maxBookings = 0;

   for (int i = 0; i < n; i++) {
      auxArray.push_back(make_pair(arrival[i], 1));
      auxArray.push_back(make_pair(departure[i], 0));
   }
   sort(auxArray.begin(), auxArray.end());

   for (int i = 0; i < auxArray.size(); i++) {

      if (auxArray[i].second == 1) {
         activeBookings++;
         maxBookings = max(maxBookings, activeBookings);
         
      }
      else
         activeBookings--;
   }  
   return (k >= maxBookings);
}

int main(){
   
   int arrival[] = { 1, 4, 5, 7 };
   int departure[] = { 3, 5, 6, 9 };
   int k = 1;
   int n = sizeof(arrival) / sizeof(arrival[0]);
   
   if(isBookingValid(arrival,departure, n, k))
      cout<<"All booking are possible";
   else
      cout<<"Booking not possible";
     
   return 0;
}

输出

All booking are possible

另一种方法:

我们可以避免使用辅助数组。我们可以使用给定的到达和离开时间数组来检查酒店的预订情况。

然后检查重叠情况,如果重叠数量大于 k,则返回 false,否则返回 true。

由于有 k 个房间,一个简单的方法是检查第 k 次到达,并检查它是否在范围内。

程序示例:

示例

在线演示

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

bool isBookingPossible(int arrival[], int departure[], int K, int N){
   
   sort(arrival, arrival + N);
   sort(departure, departure + N);
   
   for(int i = 0; i < N; i++)
   {
      if (i + K < N && arrival[i + K] < departure[i])
      {
         return false;
      }
   }
   return true;
}

int main(){
   
   int arrival[] = { 1, 2, 3 };
   int departure[] = { 2, 3, 4 };
   int N = sizeof(arrival) / sizeof(arrival[0]);
   int K = 1;
   if(isBookingPossible(arrival, departure, K, N))
      cout<<"All booking are possible";
   else
      cout<<"Booking not possible";
   return 0;
}

输出

All booking are possible

更新于:2021年1月22日

259 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告