| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | MyStack 001 | 100 (p) | 1.0s | 256M |
| 2 | MyStack 002 | 100 (p) | 1.0s | 256M |
| 3 | Dãy ngoặc | 100 (p) | 1.0s | 256M |
| 4 | Dãy ngoặc | 100 (p) | 0.5s | 1G |
| 5 | Biểu thức hậu tố | 100 (p) | 1.0s | 1023M |
| 6 | Xóa chữ số | 100 (p) | 1.0s | 256M |
| 7 | Xây dựng mảng | 100 (p) | 0.5s | 256M |
| 8 | Xếp hàng | 100 (p) | 0.5s | 1G |
Hãy viết một chương trình mô phỏng cách hoạt động của một Ngăn xếp stack. Lần lượt đọc vào các câu lệnh và thực hiện nó. Các câu lệnh mà bạn cần lập trình là:
init: Khởi tạo một Stack rỗng.push: Thêm một số nguyên vào Stack. Số nguyên cần thêm sẽ ở dòng ngay bên dưới câu lệnh này.pop: Nếu stack không rỗng, xóa số nguyên ở trên cùng Stack. top hoặc peek: Nếu Stack rỗng, in ra \(-1\). Ngược lại, in ra giá trị phần tử ở trên cùng Stack.size: In ra số lượng phần tử có trong Stack.empty: In ra \(1\) nếu Stack rỗng. Ngược lại, in ra \(0\).init.push sẽ gồm 2 dòng dữ liệu, những lệnh còn lại chỉ gồm 1 dòng dữ liệu.Số nguyên đằng sau lệnh push có giá trị không âm và bé hơn \(1510\).
top, peek, size, empty, hãy in ra đáp án trên một dòng riêng biệt.3
init
push
5
top
5
18
init
top
peek
push
69
peek
push
96
top
size
pop
size
pop
size
top
pop
push
1
size
init
size
-1
-1
69
96
2
1
0
-1
1
0
Sau khi làm bài MyStack 001 xong, bạn cảm thấy Stack thật dễ hiểu nên cũng hơi nhàm chán, bạn muốn chỉnh sửa lại những câu lệnh. Bây giờ, các câu lệnh sẽ là:
init: Khởi tạo một Stack rỗng.push: Thêm một số nguyên vào Stack. Số nguyên cần thêm sẽ ở dòng ngay bên dưới câu lệnh này.pop: Nếu stack không rỗng, xóa số nguyên ở trên cùng Stack. top: Nếu Stack rỗng, in ra \(-1\). Ngược lại, in ra giá trị phần tử ở trên cùng Stack.sum: Tính tổng các phần tử trong Stack và in ra màn hình.init.push sẽ gồm 2 dòng dữ liệu, những lệnh còn lại chỉ gồm 1 dòng dữ liệu.Số nguyên đằng sau lệnh push có giá trị không âm và bé hơn \(1510\).
top, sum, hãy in ra đáp án trên một dòng riêng biệt.8
init
sum
push
9
sum
push
60
sum
pop
sum
0
9
69
9
Có thể định nghĩa khái niệm dãy ngoặc đúng dưới dạng đệ quy như sau:
"\(()\)" là dãy ngoặc đúng
\(C\) là dãy ngoặc đúng nếu \(C = (A)\) hay \(C = AB\) với \(A, B\) là các dãy ngoặc đúng.
Ví dụ dãy ngoặc đúng: \((), (()), ()(), (())()\)
Ví dụ dãy ngoặc sai: \()(, ((((, ()((, )))), )()(\)
Bạn hãy viết chương trình liệt kê tất cả các dãy ngoặc đúng có chiều dài \(n\) (\(n\) chẵn)
Test 1
4
2
Ví dụ 1: Có 2 dãy ngoặc đúng là: \((())\), \(()()\)
Test 2
2
1
Ví dụ 2: Có 1 dãy ngoặc đúng l
Một dãy ngoặc đúng là một xâu gồm các ký tự (, ), [, ], { và } định nghĩa như sau:
A và B là hai dãy ngoặc đúng thì AB (xâu tạo thành bằng cách lấy xâu A nối vào trước xâu B) cũng là một dãy ngoặc đúng,A là một dãy ngoặc đúng thì (A), [A] và {A} cũng là những dãy ngoặc đúng.Những xâu không thành lập được theo quy tắc trên không phải là dãy ngoặc đúng.
Ví dụ {[()()[]()]}() là một dãy ngoặc đúng nhưng [(]) và }}}{{{ không phải là những dãy ngoặc đúng.
Vào từ file văn bản PARENTHESES.INP
(, ), [, ], { và }.Ghi ra file văn bản PARENTHESES.OUT ứng với mỗi xâu trong file dữ liệu, ghi ra trên một dòng từ YES nếu xâu đó là dãy ngoặc đúng, ghi ra từ NO nếu xâu đó không phải dãy ngoặc đúng.
Test 1
4
{[()()[]()]}()
[(])
([{}]){[()]}
{{{}}
YES
NO
YES
NO
Nguồn: Thầy Lê Minh Hoàng
Cho một biểu thức hậu tố với số hạng là các số nguyên dương và ba toán tử \(+, -, *\). Hãy tính giá trị của biểu thức hậu tố.
Ví dụ: biểu thức hậu tố: \(2\ 3\ 4\ +\ *\ 5\ -\ 2\ 2\ *\ +\) có giá trị là 13.
Dữ liệu đề bài cho đảm bảo biểu thức hậu tố là hợp lệ. Trong quá trình tính toán đảm bảo trị tuyệt đối các giá trị trung gian không vượt quá \(10^9\).
Test 1
2 3 4 + * 5 - 2 2 * +
13
Giải thích: \(2\ 3\ 4\ +\ *\ 5\ -\ 2\ 2\ *\ + = 2 * (3+4) - 5 +(2*2)=13\)
Hãng cung cấp dịch vụ điện thoại XYZ khuyến khích nhiều người đăng kí thuê bao bằng cách: Khi khách hàng đến đăng kí thuê bao thì sẽ được cấp hai số may mắn là số nguyên dương \(n\) và \(k\), hãng sẽ khuyến mại người đó một số tiền nhận được từ số \(n\) sau khi xóa đúng \(k\) chữ số (\(k\) nhỏ hơn số chữ số của \(n\)). Hải vừa mới đăng kí thuê bao của hãng và được cung cấp hai số \(n\) và \(k\).
Yêu cầu: Bạn hãy giúp Hải xóa đi \(k\) chữ số của số \(n\) để số nhận được số tiền là lớn nhất.
Test 1
58816
2
886
Test 2
2357111317192329
6
7317192329
Cho một dãy số nguyên \(A\) gồm \(n\) phần tử. Ta định nghĩa mảng \(B\) gồm \(n\) phần tử, với \(B[i]\) được tính như sau:
Ví dụ: Với \(A = {2,5,3,6}\) thì \(B = {0,2,2,3}\)




Yêu cầu: Cho mảng \(A\), hãy tìm và in ra mảng \(B\) thõa mãn điều kiện trên.
Test 1
4
2 5 3 6
0 2 2 3
Trong giờ học đội ngũ, có \(n\) người xếp hàng dọc đánh số từ \(1\) tới \(n\), người thứ \(i\) có chiều cao là \(h_i\). Người có chỉ số nhỏ hơn đứng trước.
Sau khi xếp hàng, có một số người phàn nàn rằng anh ta bị người khác chắn tầm mắt. Cụ thể là người \(i\) bị người \(j\) chắn tầm mắt nếu:
Yêu cầu: Với mỗi người, cho biết anh ta bị người nào chắn tầm mắt.
Vào từ file văn bản LINEUP.INP
Ghi ra file văn bản LINEUP.OUT \(n\) số \(k_1, k_2, \ldots, k_n\) cách nhau bởi dấu cách. Trong đó \(k_i\) là số hiệu người chắn tầm mắt của người \(i\). Nếu người \(i\) không bị ai chắn tầm mắt, thì quy ước \(k_i = 0\).
Test 1
9
30 20 10 40 90 50 40 60 70
0 1 2 0 0 5 6 5 5
Nguồn: Thầy Lê Minh Hoàng