| # | 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 | Xây dựng mảng | 100 (p) | 0.5s | 256M |
| 4 | Kiểm tra chuỗi ngoặc đúng | 100 (p) | 1.0s | 256M |
| 5 | Biểu thức hậu tố | 100 (p) | 1.0s | 1023M |
| 6 | Mua vé | 100 (p) | 1.0s | 256M |
| 7 | Đàn bò | 100 (p) | 1.0s | 256M |
| 8 | Số may mắn | 100 (p) | 1.0s | 256M |
| 9 | Dãy ngoặc | 100 (p) | 1.0s | 256M |
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
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
Một dấu ngoặc bao gồm những ký tự như sau: (, ), {, }, [, or ].
Một cặp ngoặc đúng bao gồm (), {}, []. Còn lại, những cặp ngoặc như ((, (}, [},... đều không phải là cặp ngoặc đúng.
Ta định nghĩa một chuỗi ngoặc đúng như sau:
[{}]" là đúng thì "(+[{}]+)" sẽ đúng).{[]}" là đúng thì "{[]}+[()]" sẽ đúng).Đề bài cho bạn \(N\) chuỗi ngoặc. Nếu chuỗi thứ \(i\) là chuỗi ngoặc đúng, in ra YES, ngược lại in ra NO.
YES hoặc NO tương ứng với nếu chuỗi \(S_i\) là chuỗi ngoặc đúng hoặc không đúng.Test 1
3
{[()]}
{[(])}
{{[[(())]]}}
YES
NO
YES
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\)
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