Thuật toán
Ta sẽ đánh dấu mỗi thời điểm một người chuyển vào ($s_i$) là một dấu ngoặc mở, và thời điểm một người chuyển ra ($e_i$) là một dấu ngoặc đóng. Gọi mỗi thời điểm được đánh dấu là thời điểm quan trọng Sau đó, ta sẽ tạo một xâu ngoặc dựa trên $2N$ thời điểm khách ra và vào theo cơ chế như sau:
- Thời điểm quan trọng nào xảy ra trước thì viết dấu ngoặc tương ứng với thời điểm đó trước
- Nếu có nhiều hơn hoặc bằng hai sự kiện (khách ra/vào) xảy ra trong cùng một thời điểm quan trọng, dấu ngoặc đóng luôn đứng trước dấu ngoặc mở. Nếu dấu ngoặc tương ứng của hai thời điểm giống nhau thì viết thế nào cũng được.
Ví dụ, với test mẫu thứ 2, ta sẽ đánh dấu từng thời điểm với dấu ngoặc tương ứng như sau
$\begin{array}{cccc}\text{Thời điểm}&1&2&3\\&(&(&))\end{array}$
Do đó, dãy ngoặc cho test thứ 2 là (())
Dễ thấy, dãy ngoặc được sinh ra luôn là dãy ngoặc đúng.
Bài toán của chúng ta thực chất là tìm xem có nhiều nhất bao nhiêu người cùng ở trong cùng một thời điểm. Dễ thấy, ta cần có $2N$ thời điểm cần quan tâm, và các thời điểm đó chính là các thời điểm quan trọng.
Gọi $b_i$ và $c_i$ lần lượt là số ngoặc mở và ngoặc đóng đến ký tự thứ $i$ trong dãy ngoặc tạo được. Ta thấy trong thời điểm quan trọng thứ $i$, có $b_i - c_i$ khách đang ở trong khách sạn cùng một lúc. Do đó đáp án của chúng ta sẽ là $max(b_1-c_1, b_2-c_2, \ldots, b_{2N} - c_{2N}$
Do bài này kiếm được tới 1100 ucoin trên ucode nên mình sẽ để việc code là thử thách cho bạn. Một phần code của mình ở bên dưới cho bạn tham khảo.
#include <bits/stdc++.h>
#define ll long long
#define ios ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#pragma GCC optimize("O3","unroll-loops")
#pragma GCC optimize("Ofast")
using namespace std;
int main() {
ios
ll n;
cin>>n;
vector<pair<ll,ll>>a;
for(int i=0;i<n;i++)
{
ll p,d;
cin>>p>>d;
a.push_back(make_pair(p,1));
a.push_back(make_pair(d,-1));
}
sort(a.begin(),a.end());
ll m=0;
ll l=0;
for(const auto&c:a)
{
l+=c.second;
m=max(m,l);
}
cout<<m ;
return 0;
}
Tin học là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng. Tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin. Hãy tận dụng sức mạnh của tin học để giải quyết các vấn đề và sáng tạo ra những giải pháp mới!
Lớp 9 - Là năm cuối ở cấp trung học cơ sở, chúng ta sắp phải bước vào một kỳ thi căng thẳng và sắp chia tay bạn bè, thầy cô. Áp lực từ kỳ vọng của phụ huynh và tương lai lên cấp 3 thật là lớn, nhưng hãy tin vào bản thân và giữ vững sự tự tin!
Copyright © 2024 Giai BT SGK