Tải bản đầy đủ (.docx) (10 trang)

Bài tập chuyên đề Duyệt toàn bộ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (101.48 KB, 10 trang )

CHUYÊN ĐỀ DUYỆT
A. MỞ ĐẦU
Chúng ta đã biết một trong những đặc điểm ưu việt của máy tính điện tử là khả
năng tính tốn nhanh và chính xác. Vì lý do đó nên duyệt (vét cạn) là một trong
những thuật toán thường được nhắc đến nhiều nhất trong Tin học.
Trong ba chiến lược thiết kế thuật tốn chính (duyệt – vét cạn, đệ qui- quy
hoạch động và tham lam) thì “duyệt – vét cạn” giải quyết được lượng lớn các bài tập
hơn cả.
Duyệt hay còn gọi là vét cạn được chia thành hai nội dung chính: Duyệt bằng
các vịng lặp với các bài tốn có kích thước tương đối lớn và dùng đệ qui duyệt các
bài tốn tổ hợp có kích thước nhỏ. Trong chuyên đề này chỉ giới thiệu về nội dung
thứ nhất DUYỆT – VÉT CẠN BẰNG CÁCH SỬ DỤNG CÁC VÒNG LẶP.
B. NỘI DUNG
I. LÝ THUYẾT VỀ PHƯƠNG PHÁP DUYỆT
1. Các bước giải bài toán duyệt.
Bước 1: Mô tả đối tượng cần duyệt bằng các tham số (biến); Xác định phạm vi
duyệt (Viết các câu lệnh lặp để duyệt).
Bước 2: Viết phần kiểm tra với mỗi đối tượng duyệt nêu trên
Bước 3: Viết phần update kết quả; xác định việc khởi tạo giá trị đầu cho kết quả.
Bước 4: Tối ưu được thuật toán tốt hơn.
+. Tối ưu phần kiểm tra.
+. Tối ưu phần duyệt.
2. Kiến thức bổ trợ giúp tối ưu thuật toán duyệt
a) Quy hoạch động đơn giản: Thường dùng để tính tốn trước giúp cho tối ưu
phần kiểm tra. Một số thao tác tính tốn trước bằng quy hoạch động:
+. Cộng dồn: Để tính tổng, đếm từ a i đến aj (QHĐ mất O(n); truy vấn mất
O(1));
+. Tìm phần tử có giá trị min, max từ a 1 đến ai hoặc từ an đề ai (chuẩn bị bằng
QHĐ mất O(n); truy vấn mất O(1))
Lmin[1]:=a[1];
for (int i=2; i<=n; i++) Lmin[i]:=min(Lmin[i-1],a[i]);


+. Tìm phần tử đầu tiên từ a 1 đến ai-1 có giá trị nhỏ hơn (lớn hơn) X (Chuẩn bị
bằng mảng Lmin trên mất O(n); truy vấn bằng tknp mất O(lgn));
+. Cộng dồn trên bảng để tính tổng, đếm từ a ij đến alh (Chuẩn bị mất O(m*n);
truy vấn mất O(1));
b) Dùng cây


+. Tìm max, min trên đoạn i,j bất kỳ; mảng có thể thay đổi từng phần tử; thay
đổi và truy vấn có thể đan xen (Tạp cây ban đầu mất O(nlgn); thay đổi và cập nhật
cây, tìm max, min mất O(lgn);
+. Tính tổng, đếm trên đoạn i, j bất kỳ khi có sự thay đổi giá trị của một phần
tử trong mảng, thay đổi và truy vấn có thể đan xen.
+. Tính tổng, đếm trên đoạn i, j bất kỳ khi có sự thay đổi (tăng hoặc giảm các
phần tử liên tiếp nhau một số đơn vị) thay đổi và truy vấn có thể đan xen nhau =>
phải dùng cây Lazy
c) Dùng hàng đợi, stack, hàng đợi ưu tiên:
+. Hàng đợi: Để tìm max, min trên đoạn có độ dài cố định (dạng con trượt
chạy trên mảng.
+. Stack: Để tìm phần tử liền trước i hoặc liền sau i có giá trị nhỏ hơn (lớn
hơn ai).
d) Một số kiến thức khác
- Đếm phân phối;
- Kỹ thuật Neo;
- Tìm kiếm nhị phân.
II. BÀI TẬP ÁP DỤNG
2.1. Các bài toán duyệt với 1 tham số:
Bài 1: DUYỆT MẢNG (duyetmang.cpp)
Cho một dãy số ngun dương a1, a2,..,an. Hãy lập trình tính tổng các phần tử
chẵn của dãy a.
Input: Dữ liệu nhập vào từ bàn phím gồm:

- Dịng 1: Một số ngun dương n (n ≤106)
- Dòng 2 là các số nguyên dương a1, a2,.., an (ai ≤ 109)
Output: Đưa ra màn hình một số nguyên duy nhất là tổng các phần tử chẵn tìm
được.
Ví dụ:
Input
5
2 13 4 2

Output
8

1

Bước 1: Mơ tả đối tượng duyệt, phạm vi duyệt,...
+ Đối tượng duyệt: phần tử của mảng
+ Mô tả: Gọi i là chỉ số cả các phần tử cần duyệt.
+ Phạm vi: i nhận giá trị từ 1 đến n.
+ Câu lệnh lặp để duyệt:
for (int i=1; i<=n; i++)


Bước 2: Phần kiểm tra
Bước 3: Update kết quả
Code:

a[i]%2 == 0
tong=tong+a[i]; // khởi tạo tong=0;

PASCAL

kq:=0;
for i:=1 to n do
if a[i] mod 2 =0 then kq:=kq+1;
write(kq);

C++
kq=0;
for (int i=1; i<=n; i++)
if (a[i]%2==0) kq++;
cout << kq;

Mở rộng bài tốn: Có thể thay đổi một trong hai phần sau để được một bài toán
khác tương tự như bài toán trên.
+ Thay phần điều kiện “chẵn” thành các điều kiện khác: lẻ, nguyên tố, hoàn
hảo,…. Nếu là điều kiện phức tạp ta nên tách phần kiểm tra điều kiện thành một
hàm riêng.
+ Thay phần update kết quả “tính tổng” thành: đếm, tìm max, min,... cũng sẽ
được bài tập khác tương tự như bài toán trên.
Danh sách bài tập tương tự:
STT

Yêu cầu

2.2. Các bài toán duyệt với hai hoặc nhiều tham số
Bài 2: ĐOẠN CON
Cho một dãy A gồm N số nguyên A1, A2,..., AN. Hãy xác định một đoạn con
các phần tử liên tiếp trong dãy A sao cho tổng các phần của đoạn con đó là lớn nhất.
Dữ liệu vào: Từ tệp Doancon.inp có cấu trúc như sau:
- Dòng 1: Số nguyên dương N
- Dòng 2: N số nguyên A1, A2, ..., AN (Ai ≤ 109)

Kết quả: Ghi ra tệp Doancon.out gồm một số ngun duy nhất là tổng đoạn con
tìm được.
Ví dụ:
Doancon.inp
7
3 -4 1 7 4 -5 2
Ràng buộc:
Subtask 1: N ≤ 300;
Subtask 2: N ≤ 5000;

Doancon.out
12


Subtask 3: N ≤ 106.
Ý tưởng:
Bước 1: Mô tả đối tượng duyệt, phạm vi duyệt,...
+ Đối tượng duyệt: Tất cả các đoạn con của mảng
+ Mô tả:
- Gọi i là chỉ số phần tử đầu tiên của đoạn cần duyệt.
- Gọi j là chỉ số phần tử cuối cùng của đoạn cần duyệt.
+ Phạm vi:
i nhận giá trị từ 1 đến n.
Với mỗi i thì j nhận giá trị từ i đến n.
+ Câu lệnh lặp để duyệt:
for (int i=1; i<=n; i++)
for (int j=i; j<=n; j++)
Bước 2: Phần kiểm tra
Tính tổng ai + ai+1+,...+aj (Nên sử dụng hàm)
Bước 3: Update kết quả

kq=max(kq, tổng đoạn vừa tính được).
PASCAL
kq:=-1000000000;
for i:=1 to n do
for j:=1 to n do
begin
s:=tong(i,j);
kq:=max(kq,s);
end;
write(kq);

C++
kq=-1000000000;
for (int i=1; i<=n; i++)
for (int j=i; j<=n; j++)
{
s=tong(i,j);
kq=max(kq,s);
}
cout << kq;

Mở rộng bài tốn: Có thể thay phần kiểm tra (tính tổng) hoặc phần cập nhật kết
quả (tìm max) bằng các yêu cầu khác sẽ được các bài toán tương tự
Bước 4: Tối ưu
- Dùng mảng cộng dồn (qui hoạch động đơn giản sẽ được subtask2.
- Dùng thêm mảng tìm Min của mảng cộng dồn sẽ đạt subtask 3.
2.3. Nghiên cứu một số bài toán duyệt trong những đề thi HSG cấp tỉnh
Bài 3: DÃY SỐ (dayso.cpp)
Cho số nguyên dương n và một dãy số nguyên a 1, a2, ..., an và một số nguyên
dương k. Hãy xác định một đoạn con gồm một hoặc một số phần tử liên nhau của

dãy a để tổng các phần tử dương trong đoạn con này là lớn nhất và số lượng các
phần tử âm không vượt quá k.
Yêu cầu: Tìm tổng các phần tử dương của đoạn con tìm được.
Dữ liệu vào: File văn bản DAYSO.INP
• Dịng 1 chứa hai số nguyên n, k (n ≤ 5000, k≤n).


• Dòng 2: chứa các số nguyên của dãy a, các phần tử cách nhau một dấu cách
ai

trống và ≤ 109 với 1 ≤ i ≤ n
Dữ liệu ra: File văn bản DAYSO.OUT gồm một số nguyên duy nhất là tổng các
phần tử dương trong dãy con tìm được.
Ví dụ:
DAYSO.INP
10 1
4 -3 8 -2 6 9 -1 8 1 2

DAYSO.OUT
24

Ràng buộc
- 60% điểm tương ứng với 60% bộ test có n≤ 300
- 40% điểm tương ứng với 40% bộ test có n> 300
Bài 4: DÃY CÂN BẰNG (daycb.cpp)
Một dãy số nguyên được gọi là dãy cân bằng nếu dãy số đó có số lượng phần
tử dương bằng số lượng phần tử âm.
ai ≤ 109

Yêu cầu: Cho một dãy số nguyên a gồm n số nguyên a 1, a2,...,an. (ai ≠ 0,

).
Hãy tìm một đoạn con dài nhất của dãy trên sao cho đoạn con đó tạo thành một dãy
cân bằng.
Dữ liệu vào: File văn bản DAYCB.INP gồm 2 dịng:
• Dịng 1: Một số nguyên dương n là số lượng phần tử của dãy a.
• Dịng 2: n số ngun a1, a2,...,an. (ai ≠ 0,

ai ≤ 109

).

Dữ liệu ra: File văn bản DAYCB.OUT. Ghi ra một số nguyên duy nhất là độ dài của
đoạn con dài nhất tìm được thỏa mãn là dãy cân bằng.
Ví dụ:
DAYCB.INP
7
8 -1 1 -2 5 3 6

DAYCB.OUT
4

Ràng buộc:
Subtask 1: n≤ 300.
Subtask 2: n≤ 5000.
Subtask 3: n≤ 106.
Bài 5: DÃY SIÊU TĂNG (Sieutang.cpp)

GIẢI THÍCH
Đoạn con tìm được là:
8 -1 1 -2

Hoặc:
-1 1 -2 5


Cho một dãy số nguyên A gồm N phần tử A1, A2,…, AN.
Dãy A được gọi là dãy Siêu tăng nếu mọi phần tử Ai (i =1 .. N) có giá trị lớn
hơn hoặc bằng tổng các giá trị trước nó.
u cầu: Hãy tìm vị trí i nhỏ nhất mà tại đó A i làm cho dãy A khơng thỏa mãn là
i −1

∑A
j =1

j

dãy siêu tăng. Có nghĩa là tìm i nhỏ nhất sao cho Ai <
.
Dữ liệu vào: Từ tệp SIEUTANG.INP có cấu trúc như sau:
6
• Dịng 1: Chứa số nguyên dương N, là số phần tử của dãy A (N ≤ 10 ).


Dịng 2: Chứa N số ngun A1, A2,…, AN. (

Ai

≤ 109 với 1 ≤ i ≤ N).

Dữ liệu ra: Ghi vào tệp SIEUTANG.OUT
Gồm một số nguyên dương duy nhất là: Chỉ số i nhỏ nhất tìm được; Nếu

khơng tìm được chỉ số i nào thì ghi kết quả bằng 0.
Ví dụ1:
SIEUTANG.INP
5
1

SIEUTANG.OUT
4

2

5

6

14

20

Ví dụ2:
SIEUTANG.INP
4
-1

SIEUTANG.OUT
0

2

5


10

Ràng buộc:
- Có 80% điểm tương ứng với 80% test có chiều dài của N ≤ 5000.
- Có 20% điểm tương ứng với 20% test có chiều dài của N > 5000.
Bài 6: CHIA QUÀ (Chiaqua.cpp)
Thầy Tuyên có N hộp quà được xếp thành một hàng ngang, hộp quà thứ i có
Ai chiếc kẹo (với 1 ≤ i ≤ N, Ai ≤ 109).
Nhân dịp tết trung thu, thầy Tuyên chia số hộp quà đó cho hai chị em là con
gái và con trai của thầy. Mỗi người trong hai chị em sẽ nhận được đúng K hộp quà
liên tiếp. Nếu còn dư hộp quà nào thầy sẽ cất để dùng cho dịp sau.
Yêu cầu: Là người chị, bạn hãy chọn ra K hộp quà cho em và K hộp quà cho mình
sao cho tổng số kẹo của cả hai chị em là lớn nhất.
Dữ liệu vào: Từ tệp CHIAQUA.INP có cấu trúc như sau:




Dòng 1: Chứa hai số nguyên dương N, K (2 ≤ N ≤ 106, K ≤ N/2).



Dịng 2: Chứa N số nguyên dương A1, A2,…, AN. (Ai ≤ 109 với 1 ≤ i ≤ N).

Mỗi giá trị cách nhau bởi ít nhất một kí tự cách trống.
Dữ liệu ra: Ghi vào tệp CHIAQUA.OUT
Gồm một số nguyên dương duy nhất là: Tổng số kẹo nhiều nhất mà hai chị
em nhận được.
Ví dụ:

CHIAQUA.INP

CHIAQUA.OUT

9 3
31
2 6 1 5 3 8 2 9 1
Ràng buộc:
- Có 50% điểm ứng với N ≤ 300.
- Có 30% điểm ứng với 300 < N ≤ 5000.
- Có 20% điểm ứng với 5000 < N ≤ 106.
Bài 7: VUI XUÂN (vuixuan.cpp)
Trong dịp tết nguyên đán Tí theo cha, mẹ về quê ăn tết và tham gia vui xuân.
Tí rất thích thú với những trị chơi dân gian ở q mình. Trong buổi vui xn hơm
đó ban tổ chức có tất cả N trị chơi, với trị chơi thứ i (1 ≤ i ≤ N) người chơi phải nộp
một số tiền lệ phí là Ti đồng (để chi phí cho việc tổ chức và mua dụng cụ).
Do có nhiều người muốn tham gia các trò chơi nên ban tổ chức yêu cầu:
- Ai muốn chơi phải đăng kí trước các trị chơi và nộp đủ số tiền lệ phí cho
các trị chơi đó.
- Mỗi người chơi chỉ được phép đăng kí các trị chơi liên tiếp nhau, mỗi trị
chơi chỉ được chơi nhiều nhất một lần.
u cầu: Tí có tổng số tiền là S đồng. Hãy cho biết Tí có thể chơi tối đa bao nhiêu
trị chơi.
Dữ liệu vào: Từ bàn phím gồm:
- Dịng đầu tiên gồm hai số nguyên dương N và S (N ≤ 106, S ≤ 1018).
- Dòng thứ hai chứa N số nguyên dương T1, T2,…,TN (Ti ≤ 109)
Dữ liệu ra: Ghi ra màn hình một số nguyên duy nhất là số trò chơi tối đa mà Tí có
thể chơi.
Ví dụ:
INPUT

8 7
1 10 2 3 1 4 3 6
Ràng buộc

OUTPUT
3


- Có 60% điểm ứng với N ≤ 100.
- Có 20% điểm ứng với 100 < N ≤ 5000.
- Có 20% điểm ứng với 5000 < N ≤ 106.
Bài 8: CHỤP ẢNH ĐÊM RẰM (chupanh.cpp)
Hằng năm, Lễ hội Đường phố được tổ chức vào đêm rằm tháng 8 tại thành
phố Tuyên Quang. Lễ hội năm nay, được tổ chức rất quy mô và tráng lệ nên Cuội
quyết định sẽ xuống hạ giới để có thể xem các bạn nhỏ Tuyên Quang rước đèn
Trung thu.
Có tất cả N mơ hình (được đánh số từ 1 đến N) xếp thành một hàng để tham
gia rước đèn. Mỗi mơ hình là hình ảnh tuyệt đẹp của 1 con vật trong số 12 con giáp,
các mơ hình với những hình dáng, mầu sắc khác nhau tạo thành một không gian
lung linh, huyền ảo.
Cuội ngắm nhìn rất lâu sau đó lấy trong túi ra một iphone10 để chụp một bức
ảnh đem về khoe với chị Hằng Nga. Cuội muốn trong bức ảnh của mình phải có đầy
đủ 12 con giáp, Cuội chỉ có thể chụp các mơ hình đứng liên tiếp nhau. Dù là
iphone10 nhưng Cuội cũng rất cẩn thận chọn ra một không gian vừa đủ để chụp ảnh
cho rõ nét nhất.
Yêu cầu: Hãy tìm đoạn ngắn nhất chứa các mơ hình liên tiếp nhau sao cho đoạn đó
có đủ 12 con giáp để Cuội chụp ảnh.
Dữ liệu vào: Từ tệp chupanh.inp có cấu trúc như sau:
- Dòng đầu tiên chứa số nguyên dương N (1 ≤ N ≤ 105).
- Dòng thứ 2 chứa N số nguyên, các số nguyên này có giá trị nằm trong đoạn

[1..12] là mã hóa tên các con vật trong 12 con giáp của các mơ hình, các số này cách
nhau bởi 1 kí tự cách trống.
Dữ liệu ra: Ghi vào tệp chupanh.out một số nguyên duy nhất là số lượng mơ hình
ít nhất có mặt trong bức ảnh mà Cuội sẽ chụp. Nếu khơng có cách chọn thì ghi kết
quả là "0"
Ví dụ:
chupanh.inp
15
13
1 2 3 1 12 11 10 9 8 7 8 6 5 4 7
Ràng buộc:
- Có 80% điểm ứng với N ≤ 300.
- Có 20% điểm ứng với N > 300.

Bài 9:TIÊU CHUẨN VIETGAP (vietgap.cpp)

chupanh.out


Hàng năm, Cứ đến dịp trung thu chị Hằng Nga lại xuất hiện để chung vui
cùng các em nhi đồng. Năm nay, xuống trần gian chị Hằng Nga còn được Ngọc
Hồng giao thêm một nhiệm vụ đó là: Đo tiêu chuẩn chất lượng VietGAP của trang
trại cam gia đình Cuội.
Hằng Nga đã mang theo một chiếc máy để đo hàm lượng độc tố trong mỗi
quả cam. Cuội đã đưa cho chị Hằng Nga N quả cam để kiểm tra chất lượng. Sau khi
đo, quả cam thứ i có hàm lượng độc tố là một số nguyên không âm ai.
Chị Hằng Nga sẽ chọn một số nguyên dương X sao cho có nhiều quả cam có
hàm lượng độc bằng X nhất để làm đại diện báo lên cho Ngọc Hoàng. Nếu có nhiều
giá trị X cùng thỏa mãn yêu cầu của đề bài thì chị Hằng Nga sẽ chọn X nhỏ nhất (Vì
dù sao xưa kia cũng đã có mối thâm tình với Cuội).

Hãy cho biết số X mà Chị Hằng Nga mang theo mình lên thiên đình để báo
cho Ngọc Hồng.
Dữ liệu vào: Từ bàn phím gồm:
- Dịng 1: Chứa số nguyên dương N (N ≤ 106).
- Dòng 2: Chứa N số nguyên không âm a1, a2, …, aN (ai ≤ 106).
Kết quả: Ghi ra màn hình một số nguyên dương X theo yêu cầu của đề bài ở trên.
Ví dụ 1:
INPUT
6
3 5 3
Ví dụ 2:

OUTPUT
3

2 8 4
INPUT

7
8

OUTPUT
5

5

3

7 8 5 4


Bài 10: TỈA CAM (tiacam.cpp)
Sinh ra và lớn lên trên mảnh đất Hàm Yên, Cuội đã rất yêu thích nghề trồng
trọt đặc biệt là đối với cây cam sành. Khi đi học, Cuội lại có thêm một đam mê nữa
đó là việc học tập môn Tin học. Và rồi Cuội đưa ra quyết định học thật giỏi môn Tin
học để áp dụng cho việc trồng và chăm sóc cây cam sành cho trang trại của nhà
mình.
Trang trại nhà Cuội có tất cả N cây cam được đánh số từ 1 đến N. Trong vụ
thu hoạch vừa rồi cây cam thứ i cho thu hoạch ai quả cam.
Để đạt hiệu quả hơn bố của Cuội có ý định tỉa các cây cam (chặt bỏ các cây
cam ít quả), ơng đã đưa ra tất cả K số nguyên b 1, b2, …,bK. Với mỗi số nguyên bi
Cuội phải trả lời nhanh rằng: “Nếu chặt tất cả các cây cam có số quả ít hơn bi thì
trang trại cịn lại bao nhiêu cây cam?”


Hãy lập trình giúp Cuội giải quyết bài tốn trên.
Dữ liệu vào: Từ bàn phím gồm:
- Dịng 1: Chứa hai số nguyên dương N và K (N, K ≤ 105)
- Dòng 2: Chứa N số nguyên dương a1, a2,..., aN (ai ≤ 109).
- Dòng 3: Chứa K số nguyên dương b1, b2, …,bK (bi ≤ 109).
Kết quả: In ra màn hình gồm: K số ngun trên một dịng là đáp án của K câu hỏi
theo u cầu của bài tốn.
Ví dụ:
INPUT
6 4
2 3 0 6
52 80 64 52 65 200
70 65 250 50
Ràng buộc:
- Có 80% điểm ứng với N, K ≤ 5000.
- Có 80% điểm ứng với N, K > 5000.


OUTPUT



×