ในปัญหานี้ เราได้รับสองอาร์เรย์ซึ่งประกอบด้วยค่า N ที่แสดงถึงการมาถึงและออกจากโรงแรมและจำนวนเต็ม k งานของเราคือ ค้นหาว่าสามารถจองได้ k ครั้งหรือไม่ตามเวลามาถึงและออกเดินทางที่กำหนด
คำอธิบายปัญหา: ที่นี่เราต้องตรวจสอบว่าโรงแรมที่มี k ห้องสามารถรองรับขาเข้าและขาออกทั้งหมดได้หรือไม่
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล: ขาเข้า :{1 4 5 7}
ออกเดินทาง :{3 5 6 9}
K =1
ผลลัพธ์: ใช่
แนวทางแก้ไข:
เพื่อแก้ปัญหา เราจะจัดเก็บขาเข้าและขาออกสำหรับโรงแรมไว้ในอาร์เรย์เสริมที่มีป้ายกำกับว่าขาเข้าหรือขาออก จากนั้นจัดเรียงอาร์เรย์นี้และนับจำนวนการจองโรงแรมที่กำลังดำเนินการอยู่
ถ้ามานับ++
ถ้าออกเดินทางนับ--.
หาก ณ จุดใดที่การจองมากกว่า k ให้ส่งคืน เท็จ อื่นกลับ จริง
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#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
แนวทางอื่น:
เราสามารถกำจัดการใช้อาร์เรย์เสริมได้ เราตรวจสอบการจองโรงแรมได้โดยใช้ 2 แถวที่ให้ไว้สำหรับการเดินทางขาเข้าและขาออก
จากนั้นตรวจสอบการทับซ้อนกันและถ้ามากกว่า k ให้คืนค่าเท็จ มิฉะนั้นคืนค่าเป็นจริง
เนื่องจากมี k ห้อง วิธีง่าย ๆ ก็คือการตรวจสอบ k th มาถึงและตรวจสอบว่าอยู่ในช่วงหรือไม่
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#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