Download as pdf or txt
Download as pdf or txt
You are on page 1of 3

1. Xếp hàng ưu tiên (MSE07B.

*)
Nguồn bài tập: https://vn.spoj.com/problems/MSE07B/
Ngân hà ng BIG-Bank mở mộ t chi nhá nh ở Bucharest và được trang bị mộ t
má y tính hiệ n đạ i với cá c công nghệ mới nhạ p, C2#, VC3+ ... chỉ chuố i mỗ i cá i là
không ai biế t lạ p trình. Hộ cà n mộ t phà n mề m mô tả hoạ t độ ng củ a ngân hà ng
như sau: Mỗ i khá ch hà ng cố mộ t mã số là số nguyên K, và khi đế n ngân hà ng
giao dịch, hộ sễ nhạ n được 1 số P là thứ tự ưu tiên củ a hộ . Cá c thao tá c chính
như sau:
(0) Kế t thú c phụ c vụ
(1KP) Thêm khá ch hà ng K và o hà ng đợi với độ ưu tiên P
(2) Phụ c vụ người cố độ ưu tiên caô nhá t và xố a khổ i danh sá ch hà ng đợi
(3) Phụ c vụ người cố độ ưu tiên thá p nhá t và xố a khổ i danh sá ch hà ng đợi.
Tá t nhiên là hộ cà n bạ n giú p rồ i.
Input: Mỗ i dồ ng củ a input là 1 yêu cà u, và chỉ yêu cà u cuố i cù ng mới cố giá
trị là 0. Giả thiế t là khi cố yêu cà u 1 thì không cố khá ch hà ng nà o khá c cố độ ưu
tiên là P (K<=106, P<= 107, tổng yêu cầu mỗi lôại không vượt quá 105.Mộ t khá ch
hà ng cố thể yêu cà u phụ c vụ nhiề u là n và với cá c độ ưu tiên khá c nhau.
Output: Với mỗ i yêu cà u 2 hoạ c 3, in ra trên 1 dồ ng mã số củ a khá ch hà ng
được phụ c vụ tương ứng. Nế u cố yêu cà u mà hà ng đợi rỗ ng, in ra số 0.
Ví dụ:
MSE07B.INP MSE07B.OUT
2 0
1 20 14 20
1 30 3 30
2 10
1 10 99 0
3
2
2
0
Gợi ý:
Nhận xét: Nếu danh sách khách hàng được đưa vàô mảng không được
sắp xếp thêô độ ưu tiên P, thì mỗi khi có thaô tác lôại 2 hôặc 3 thì ta lại phải
đi tìm min, max.
Mỗi thao tác lôại 2 hôặc 3 đều có độ phức tạp thuật toán phụ thuộc
tuyến tính vào số lượng khách hàng. Như vậy chương trình không chạy
được trông thời gian chô phép.
Do vậy, danh sách khách hàng cần được sắp xếp theo độ ưu tiên tăng
(hôặc giảm). Các thao lôại 1, 2, 3 là xen kẽ nhau nên danh sách khách hàng
liên tục biến động, việc quản lý cũng tương đối phức tạp.
Tuy nhiên, nếu sử dụng kiểu dữ liệu SET thì vấn đề trở nên đơn giản.
Chương trình minh họa:
#include<bits/stdc+.h>
#define ii pair<int, int>
using namespace std;
set<ii> s;
set<ii>::iterator it; //iterator de tro den set s int x,k,p;
int main() {
freopen("MSE07B.inp","r",stdin);
freopen("MSE07B.out","w",stdout; cin>>x;
while (x!=0) {
if (x==1) { //thao tac loai 1 cin>>k>>p; s.insert({p,k});
}
if (x==2) { //thao tac loai 2 if (!s.empty()) {
it=s.end();
--it;
cout<<it->second<<endl; s.erase(it);
} else
cout<<0<<endl;
}
if (x==3) { //thao tac loai 3 if (!s.empty()) {
it=s.begin();
cout<<it->second<<endl; s.erase(it);
} else
cout<<0<<endl;
}
cin>>x;
}
}

You might also like