Tải bản đầy đủ (.doc) (39 trang)

CHUYÊN ĐỀ BỒI DƯỠNG HSG TIN HỌC THUẬT TOÁN SẮP XẾP VÀ TÌM KIẾM

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 (248.41 KB, 39 trang )

CHUYÊN ĐỀ 3. TÌM KIẾM SẮP XẾP
1. Thuật toán tìm nhị phân trên mảng
- Thuật toán tìm kiếm nhị phân có thể tìm phần tử có giá trị bằng X trên mảng đã được
sắp xếp một cách hiệu quả trong thời gian O(logn). Thuật toán như sau:
- Giả sử cần tìm trong đoạn a[L], a[L + 1],.a[H] với giá trị cần tìm kiếm là X, trước hết ta
xem xét với giá trị của phần tử nằm giữa dãy, mid = (L + H) div 2
+Nếu a[mid] < X thì có nghĩa là đoạn từ a[L] tới a[mid] chỉ chứa các phần tử có giá trị <
X, ta tiến hành tìm kiếm tiếp với đoạn từ a[mid + 1] đến a[H]
+Nếu a[mid] > X thì có nghĩa là đoạn từ a[mid] tới a[H] chỉ chứa các phần tử có giá trị >
X, ta tiến hành tìm kiếm tiếp với đoạn từ a[L] đến a[mid -1]
+ Nếu a[mid] = X thì việc tìm kiếm thành công (kết thúc quá trình tìm kiếm).
- Quá trình tìm kiếm sẽ thất bại nếu đến một bước nào đó, đoạn tìm kiếm là rỗng.
Khi đó (L>H). Hàm được viết như sau :
Function timnhiphan(x:longint;a:mang):integer;
var d,c,tam:longint;
begin
d:=1; c:=n; timnhiphan:=0;
while (dbegin
tam:=(d+c) div 2;
if (x=a[tam]) then
begin
timnhiphan:=tam; exit;
end;
if (xif (x>a[tam]) then d:=tam+1;
end;
end;


2. Thuật toán sắp xếp nhanh trên mảng :


- Ý tưởng của thuật toán như sau: Để sắp xếp dãy coi như là sắp xếp đoạn từ chỉ số 1 đến
chỉ số n. Để sắp xếp một đoạn trong dãy, nếu đoạn chỉ có một phần tử thì dãy đã được sắp
xếp, ngược lại ta chọn một phần tử X trong đoạn đó làm "chốt", mọi phần tử có khoá nhỏ
hơn khoá của “chốt” được xếp vào vị trí đứng trước chốt, mọi phần tử có khoá lớn hơn
khoá của “chốt” được xếp vào vị trí đứng sau chốt. Sau phép hoán chuyển như vậy thì
đoạn đang xét được chia làm hai đoạn mà mọi phần tử trong đoạn đầu đều có khoá < khoá
của “chốt” và mọi phần tử trong đoạn sau đều có khoá > khoá của “chốt”. Tiếp tục sắp
xếp kiểu như vậy với 2 đoạn con, ta sẽ được đoạn đã cho được sắp xếp theo chiều tăng
dần của khoá.
Procedure qsort(d,c:longint; var e:mang);
var i,j,k,tam:longint;
begin
if (d>c) then exit;
i:=d; j:=c;
k:=e[(i+j) div 2];
repeat
while (e[i]while (e[j]>k) do j:=j-1;
if (i<=j) then
begin
tam:=e[i]; e[i]:= e[j]; e[j]:=tam;
i:=i+1; j:=j-1;
end;
until i>j;
if(dif(iend;


3. Một số kỹ thuật khác

a. Kỹ thuật đếm phân phối
- Trong trường hợp các phần tử a[1],a[2] ,...,a[n] là các số nguyên nằm trong khoảng từ -k
tới k (|k|≤106) ta có thuật toán đếm số lần xuất hiện của các giá trị từ -k tới k như sau:
Xây dựng dãy c[-k],…,c[0], c[1],..., c[k] , trong đó c[v] là số lần xuất hiện v trong dãy.
For v:= -k to k do c[v]:=0;
For i:=1 to n do c[a[i]]:=c[a[i]] + 1;
b. Kỹ thuật tìm các bộ hai (ai,aj) của dãy số thỏa điều kiện
- Nếu điều kiện là i≠j thì ta có tất cả là n*(n-1)/2 cặp
Ví dụ dãy số có 5 phần tử : 3 7 5 9 8
i = 1 → j = 2..5 tạo thành 4 cặp (3,7), (3,5), (3,9), (3,8)
i = 2 → j = 3..5 tạo thành 3 cặp (7,5), (7,9), (7,8)
i = 3 → j = 4..5 tạo thành 2 cặp (5,9), (5,8)
i = 4 → j = 5..5 tạo thành 1 cặp (9,8)
Tổng cộng có : 1 + 2 + 3 + 4 = 5*(5-1)/2 = 10 cặp.
Ta có thể dùng hai lồng nhau để duyệt hết các bộ với độ phức tạp O(n2).
For i:=1 to n-1 do
For j:=i+1 to n do <Câu lệnh>
- Nếu điều kiện là i, j bất kỳ thì ta có tất cả là n*n cặp
- Tuy nhiên tùy theo tính chất của từng bộ ta có thể dùng kĩ thuật đếm hoặc sắp xếp hoặc
duyệt từ hai phía, tìm kiếm nhị phân….
c. Kỹ thuật về dãy con, đoạn con của một dãy số
Đoạn con: Là tập hợp các phần tử liên tiếp của dãy số. Số đoạn con của một dãy là
n*(n+1)/2 đoạn.
Ví dụ dãy số có 5 phần tử : 3 7 5 9 8
i = 1 → đoạn con bắt đầu bằng a1 có 5 đoạn (3), (3,7), (3,7,5), (3,7,5,9), (3,7,5,9,8)
i = 2 → đoạn con bắt đầu bằng a2 có 4 đoạn (7), (7,5), (7,5,9), (7,5,9,8)
i = 3 → đoạn con bắt đầu bằng a3 có 3 đoạn (5), (5,9), (5,9,8)
i = 4 → đoạn con bắt đầu bằng a4 có 2 đoạn (9), (9,8)
i = 5 → đoạn con bắt đầu bằng a5 có 1 đoạn (8)



Tổng cộng có : 1 + 2 + 3 + 4 + 5 = 5*(5+1)/2 = 15 đoạn con.
Ta có thể dùng hai lồng nhau để duyệt hết các đoạn con với độ phức tạp O(n 2).
For i:=1 to n do
For j:=i to n do

<Câu lệnh>

- Cách tính trọng lượng dãy (tổng các phần tử của dãy) : Gọi F[i] là trọng lượng của dãy
xét từ 1..i được tính theo công thức : F[i] = F[i-1] + a[i];
F[1]:=a[1];
For i:=2 to n do F[i]:=F[i-1]+a[i];
Như vậy F[j] – F[i] = Sum(F[i+1], F[i+2],…,F[j]). Với i < j.
- Cách tính tổng toàn bộ các đoạn con con liên tiếp
For i := 1 to n do
Begin
S := 0;
for j := i to n do
Begin
S := S + a[j]; /* Tính tổng từ x[i] đến x[j] */
if S > max then max := S;
L := i; R := j;
End
End;
Dãy con: Là tập hợp các phần tử không liên tiếp của dãy số. Số dãy con của dãy là 2n.
Ví dụ dãy số có 3 phần tử : 3 7 5 sẽ có 23 = 8 dãy con
i = 0 → dãy con có 0 phần tử có 1 dãy (∅)
i = 1 → dãy con có 1 phần tử có 3 dãy (3), (7), (5)
i = 2 → dãy con có 2 phần tử có 3 dãy (3,7), (3,5), (7,5)
i = 3 → dãy con có 3 phần tử có 1 dãy (3,7,5)

- Ta thường dùng dãy nhị phân tương ứng để biểu diễn các dãy con. Ví dụ với dãy trên :
Dãy nhị phân :

(0 0 0) ↔ (∅);

(0 0 1) ↔ (5);

(0 1 0) ↔ (7);

(0 1 1) ↔ (7,5);

(1 0 0) ↔ (3);

(1 0 1) ↔ (3,5);

(1 1 0) ↔ (3,7);

(1 1 1) ↔ (3,7,5);


BÀI TẬP CHƯƠNG III
Bài 1: Tìm giá trị lớn nhất
Cho n số nguyên al, a2,... an.
Yêu cầu: Tìm giá trị lớn nhất trong n số đó.
Dữ liệu vào từ file ‘MAXN.INP’

Tên file chương trình ‘MAXN.???’

■ Dòng đầu là số nguyên dương n (n<106).
■ n dòng tiếp theo, dòng thứ i là số nguyên ai (|ai|<1018).


Kết quả ghi vào file ‘MAXN.OUT’ kết quả tìm được.
Ví dụ:
MAXN.INP

MAXN.OUT

2
2
7
Bài 2: Số âm lớn nhất

7

Tên file chương trình ‘NEGAMAX.???’

Cho một dãy số nguyên ai, a2,... an
Yêu cầu: Hãy tìm số âm lớn nhất trong dãy trên.
Dữ liệu vào từ file ‘NEGAMAX.INP’:
■ Dòng đầu là số nguyên dương n (n<106)
■ Dòng thứ 2 là các phần tử của dãy (phạm vi mỗi phần tử từ -2*109 đến 2*109)
Kết quả ghi vào file ‘NEGAMAX.OUT’ số âm lớn nhất tìm được.
Ví dụ:

NEGAMAX.INP
6
3 -4 5 6-8 7

NEGAMAX.OUT
-4


Bài 3: Tổng dãy số
Tên file chương trình ‘SUMARR.???’
Cho n số nguyên a1, a2,... an.
Yêu cầu: Tính tổng của n số đó.
Dữ liệu vào từ file ‘SUMARR.INP’
■ Dòng đầu là số nguyên dương n (n<106).
■ n dòng tiếp theo, dòng thứ i là số nguyên ai (|ai|<109).
Kết quả ghi vào file ‘SUMARR.OUT’ kết quả tìm được.
Ví dụ:
SUMARR.INP
2
2

SUMARR.OUT
3


1
Bài 4: Trung bình cộng
Tên file chương trình ‘AVER.???’
Cho n số nguyên a1, a2,... an.
Yêu cầu: Tính trung bình cộng của các số nguyên dương trong n số đó.
Dữ liệu vào từ file ‘AVER.INP’
■ Dòng đầu là số nguyên dương n (n<106).
■ n dòng tiếp theo, dòng thứ i là số nguyên ai (|ai|<109).
Kết quả ghi vào file ‘AVER.OUT’ kết quả tìm được (lấy 2 chữ số phần thập phân).
Ví dụ:
AVER.INP
3

2
-7
3
Bài 5: Hình chữ nhật

AVER.OUT
2.50

Tên file chương trình ‘RECT.???’

Trên mặt phẳng tọa độ, cho n điểm có tọa độ nguyên: Ai(xi, yi), A2(x2, y2),... An(xn, yn)
Yêu cầu: Hãy tìm hình chữ nhật có các cạnh song song với hệ trục tọa độ có diện tích
nhỏ nhất bao n điểm đó (điểm có thể nằm trên cạnh của hình chữ nhật tìm được).
Dữ liệu vào từ file ‘RECT.INP’:
■ Dòng đầu là số nguyên dương n (n<106).
■ n dòng tiếp theo mỗi dòng là 2 số nguyên tương ứng là hoành độ và tung độ của một

điểm (phạm vi mỗi số từ -109 đến 109).
Kết quả ghi vào file ‘RECT.OUT’ thông tin của hình chữ nhật tìm được gồm 2 dòng:
■ Dòng đầu là 2 số nguyên tương ứng là hoành độ và tung độ của đỉnh góc trái dưới. Có

tọa độ góc trái dưới và phải trên lần lượt là (-2,-2) và (3,1)
■ Dòng thứ hai là 2 số nguyên tương ứng là hoành độ và tung độ của đỉnh góc phải trên.
Ví dụ:

RECT.INP
5
0 0
1 1
3-2

-2-1
2-1

RECT.OUT
-2-2
3 1


Bài 6: Diện tích hình chữ nhật

Tên file chương trình ‘SRECT.???’

Trong mặt phẳng tọa độ Oxy cho n điểm, điểm thứ i có tọa độ (xj, yj).
Yêu cầu: Hãy tính diện tích hình chữ nhật nhỏ nhất có các cạnh song song với 2 trục tọa
độ bao cả n điểm đã cho. Các điểm đã cho có thể nằm trên cạnh của hình chữ nhật.
Dữ liệu vào từ file ‘SRECT.INP’
■ Dòng đầu chứa số nguyên dương n (n<105).
■ n dòng tiếp theo mỗi dòng là 2 số nguyên tương ứng là hoành độ và tung độ của một

điểm (phạm vi mỗi số từ -109 đến 109).
Kết quả ghi vào file ‘SRECT.OUT’ diện tích hình chữ nhật tìm được.
Ví dụ:

SRECT.INP
5
26
35
13
62
54

Bài 7. Đoạn số nguyên

SRECT.OUT
20

Tên file chương trình ‘SEGINT.???’

Cho n đoạn số nguyên được đánh số từ 1..n
Yêu cầu: Hãy cho biết tất cả các số xuất hiện ở cả n đoạn
Dữ liệu vào từ file ‘SEGINT.INP’
■ Dòng đầu chứa số nguyên dương n (n<105).
■ n dòng tiếp theo mỗi dòng là 2 số nguyên tương ứng là điểm đầu và điểm cuối của một

đoạn (phạm vi mỗi số từ -109 đến 109).
Kết quả ghi vào file ‘SEGINT.OUT’ các số tìm được theo thứ tự tăng dần.
Nếu không tìm được ghi -1.
Ví dụ:

SEGINT.INP
3
36
25

SEGINT.OUT
3
4


14
Bài 8. Hệ trục tọa độ


Tên file chương trình ‘COORDSYS.???’

Trên trục số x’Ox cho n điểm nguyên (có hoành độ nguyên). Gọi các điểm nguyên đó lần
lượt có giá trị (hoành độ) là a1, a2,... an.
Yêu cầu: Hãy cho biết phải dùng ít nhất bao nhiêu đơn vị độ dài trên x’Ox. Ví dụ:

Dữ liệu vào từ file ‘COORDSYS.INP’
■ Dòng đầu chứa số nguyên dương n (n<105).
■ n dòng tiếp theo mỗi dòng là 2 số nguyên tương ứng là điểm đầu và điểm cuối của một

đoạn (phạm vi mỗi số từ -109 đến 109).
Kết quả ghi vào file ‘COORDSYS.OUT’ các số tìm được theo thứ tự tăng dần
Ví dụ:
COORDSYS.INP
3
-5
-1
0
3
4

COORDSYS.OUT
7

Bài 9: Tích lớn nhất

Tên file chương trình ‘MULMAX.???’

Cho n số nguyên gồm n phần tử a1, a2,. an. Người ta chọn trong dãy số trên ra hai phần tử

ai và aj (i=1, 2,...n; j=1, 2,...n; i �j ). Gọi T=ai*aj
Yêu cầu: Hãy cho biết giá trị lớn nhất của T.
Ví dụ: Dãy số a là 3 2-4 7 thì chọn ra 2 phần tử là 3 và 7 thì được tích là 21 (lớn nhất)
Dữ liệu vào từ file ‘MULMAX.INP’ có nội dung như sau:
■ Dòng đầu là số nguyên dương n (n<105)
■ Trong n dòng sau, dòng thứ i là số nguyên ai (i=1, 2,… n; |ai|<109)
Kết quả ghi vào file ‘MULMAX.OUT’: một số nguyên duy nhất là giá trị lớn nhất của T.
Ví dụ:
MULMAX.INP
4

MULMAX.OUT
21


3
2
-4
7
Bài 10: Tích lớn nhất trong 3 số

Tên file chương trình ‘MULMAX3.???’

Cho một dãy số nguyên a1, a2,…, an.
Yêu cầu: Hãy chọn ra 3 số trong dãy trên sao cho tích của chúng là lớn nhất.
Dữ liệu vào từ file ‘MULMAX3. INP’
■ Dòng đầu là số nguyên dương n (n<105)
■ Dòng thứ 2 chứa dãy số a1, a2,..., an (i=1, 2,… n; |ai|<109)
Kết quả ghi vào file ‘MULMAX3.OUT’ ghi tích lớn nhất tìm được.
Ví dụ:


MULMAX3.INP
6
7 -2 4 -1 6 5
Bài 11: Phần thưởng

MULMAX3.OUT
210

Tên file chương trình ‘PRIZE.???’

Để tập cho các cháu mẫu giáo làm quen với số và các khái niệm “lớn hơn", “bé hơn” cô
giáo chuẩn bị n hộp giấy, bên ngoài hộp giấy thứ i ghi số nguyên ai. Các số ghi ngoài hộp
khác nhau từng đôi một. Các hộp được bỏ vào một túi ni lông to sẫm màu để không đọc
được số từ bên ngoài. Đến giờ học toán cô giáo cho các em lần lượt lên bàn cô, mỗi em
lấy ra hai hộp, sau đó bỏ lại vào túi hộp có số nhỏ hơn và giữ cho mình hộp kia. Lớp học
có tất cả n-1 em. Đứng quan sát, cô giáo rất hài lòng là không em nào bỏ sai hộp trở lại
vào túi. Sau khi cả lớp đã lấy xong hộp của mình cô giáo đi phát phần thưởng cho các
em, mỗi em nhận được số viên kẹo đúng bằng số ghi ở hộp mà các em có.
Phụ huynh học sinh cũng rất thích thú với phương pháp giảng dạy sinh động này. Tuy vậy
có người lo lắng, lỡ thiếu kẹo phát cho những học sinh cuối cùng thì sao? Cô giáo cho
biết là bao giờ cũng phải chuẩn bị đủ số kẹo phát cho các cháu, không thừa và không
thiếu lấy một viên!
Yêu cầu: Cho n và các số ai (1 < ai < 32767, i = 1 - n, 1 < n < 105). Hãy xác định số kẹo
cô giáo cần chuẩn bị.


Dữ liệu vào từ file văn bản PRIZE.INP:
■ Dòng đầu tiên chứa số nguyên n,
■ N dòng sau chứa các số nguyên a1, a2, . . ., an.

Kết quả đưa ra file văn bản PRIZE.OUT một số nguyên - số kẹo cần chuẩn bị.
Ví dụ:
PRIZE.INP

PRIZE.OUT

4
4
2
5
7

16

Bài 12: Giao hai dãy số

Tên file chương trình ‘DAYSO2.???’

Cho 2 dãy số nguyên x1, x2, ….xn và y1, y2, ….yn tăng nghiêm ngặt.
Yêu cầu: Hãy đếm số lượng các phần tử của x xuất hiện trong y.
Dữ liệu vào từ tập tin văn bản DAYSO2.INP, gồm:
■ Dòng đầu chứa số n,


Hai dòng tiếp theo chứa 2n số nguyên (n < 500000), trong đó n số đầu là dãy x và n

số còn lại là dãy y.
Kết quả ghi ra tập tin văn bản DAYSO2.OUT chứa một số duy nhất là kết quả tìm được.
Ví dụ:
DAYSO2.INP

5
12357
24568

DAYSO2.OUT
2


Bài 13: Giá trị lớn nhất

Tên file chương trình ‘GETMAX.???’

Cho dãy số nguyên a1, a2,. an các phần tử đôi một khác nhau.
Yêu cầu: Hãy tìm giá trị lớn nhất của dãy số đó sao cho giá trị lớn nhất đó phải thuộc tập
số nguyên: b1, b2,... bm.
Dữ liệu vào từ file ‘GETMAX.INP’:
■ Dòng thứ nhất chứa lần lượt các số nguyên dương n, m (n, m<105).
■ Trong n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<2*109; i=1,2,...n). a
■ Trong m dòng cuối, dòng thứ j chứa số nguyên bj (|bj|<2*109; j=1,2,…m)
Kết quả ghi vào file ‘GETMAX.OUT’ giá trị lớn nhất thỏa điều kiện trên.
Ví dụ:
GETMAX.INP
43
3
2
5
9
4
5
1

Bài 14: Sản xuất thiết bị

GETMAX.OUT
5

Tên file chương trình ‘MANUEQUI.???’

Trong quy trình sản xuất các thiết bị của một nhà máy có sử dụng hai máy A và B, máy A
sản xuất ra n linh kiện (gọi tắt là linh kiện a) có thông số kỹ thuật a1, a2,... an và máy B
sản xuất ra m linh kiện (gọi tắt là linh kiện b) có thông số kỹ thuật b1, b2,... bm. Một thiết
bị được tạo ra là sự kết hợp của một linh kiện a và một linh b và phải đảm bảo có tổng
thông số kỹ thuật là S. Giả thiết rằng các linh kiện do mỗi máy tạo ra đều có thông số kỹ
thuật khác nhau đôi một. Thông số kỹ thuật của một linh kiện có thể là số âm.
Yêu cầu: Hãy cho biết với quy trình sản xuất như vậy có bao nhiêu thiết bị được tạo ra?
Dữ liệu vào từ file ‘MANUEQUI.INP’:


Dòng thứ nhất chứa nguyên dương n, m và số nguyên S (n, m<105; |S|<2*109).

■ Trong n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|aị|<2* 109; i=1,2,...n).
■ Trong m dòng cuối, dòng thứ j chứa số nguyên bj (|bj|<2*109; j=1,2,...m)
Kết quả ghi vào file ‘MANUEQUI.OUT’ số lượng thiết bị được tạo ra.


Ví dụ:

MANUEQUI.INP
433
1
3

2
4
2
0
1
Bài 15: Độ lớn của dãy số

MANUEQUI.OUT
3

Tên file chương trình ‘MINMAX.???’

Cho dãy số nguyên a1, a2,... an. Người ta tìm độ lớn của dãy số thông qua cặp số a i và aj
(với i=1,2,...n; j=1,2,...n; i≠j). Tuy nhiên, để đảm bảo độ lớn không có giá trị âm người ta
xác định độ lớn của dãy số bằng phép tính |ai+aj|.
Yêu cầu: Với n số nguyên a1, a2,. an. Hãy cho biết dãy số có độ lớn trong phạm vi nào?
Dữ liệu vào từ file ‘MINMAX.INP’:
■ Dòng thứ nhất chứa số nguyên dương n(n<106).
■ Trong n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<2*109; i=1,2,...n).
Kết quả ghi vào file ‘MINMAX.OUT’: a
■ Dòng đầu ghi độ lớn nhỏ nhất của dãy số.
■ Dòng thứ hai ghi độ lớn lớn nhất của dãy số.
Ví dụ:
MINMAX.INP
5
6
-4
7
-2
-10

Bài 16: Cặp số

MINMAX.OUT
2
14

Tên file chương trình ‘SUM2ELE.???’

Cho một dãy số nguyên a1, a2,... an các phần tử đôi một khác nhau.
Yêu cầu: Với số nguyên S cho trước, hãy cho biết có bao nhiêu cặp số (ai, aj) thỏa mãn
ai+aj=S (với i≠j). Biết rằng cặp số (ai, aj) và (aj, ai) chỉ tính là một.
Ví dụ: có dãy số 3 2 5 4 1 và S=6 thì có 2 cặp số (2,4) và (5,1) thỏa điều kiện.


Dữ liệu vào từ file ‘SUM2ELE.INP’
■ Dòng đầu là số nguyên dương n và số nguyên S (n<105, |S|<1018)
■ n dòng tiếp theo, dòng thứ i là phần tử ai (|ai|<109; i=1, 2,...n).
Kết quả ghi vào file ‘SUM2ELE.OUT’ số cặp số thỏa mãn điều kiện.
Ví dụ:

SUM2ELE.INP
56
3
2
5
4
1
Bài 17: Kết bạn

SUM2ELE.OUT

2

Tên file chương trình ‘FRIEND.???’

Theo quan niệm của người Á đông cổ, mỗi cá nhân khi sinh ra đều ứng với một ngôi sao,
được gọi là sao chiếu mệnh. Các hoạt động của cá nhân đều bị chi phối bởi ngôi sao này,
kể cả quá trình kết bạn - hẹn hò. Theo thuyết Âm dương - Ngũ hành, hai người chỉ có thể
tạo lập mối quan hệ bền vững khi các sao chiếu mệnh của họ không có các thuộc tính
tương khắc. Qua hàng ngàn năm quan sát và chiêm nghiệm, các chiêm tinh gia đã ghi
nhân được hầu hết các tính chất tương sinh - tương khắc của sao: mỗi sao, ngoài một mã
số để nhân diện còn có một giá trị thể hiện khả năng thích nghi của sao gọi là độ thích
nghi. Thông qua độ thích nghi, người ta tính khả năng tương hợp của các sao. Khả năng
tương hợp của 2 sao được tính bằng tổng 2 độ thích nghi của chúng.
Yêu cầu: cho n và dãy s1,s2, ...,sn là độ thích nghi của các sao. Hãy xác định số lượng T
các cặp sao có khả năng tương hợp bằng B. Hai cặp (Si, Sj) và (Sj, Si) được tính là 1.
Ví dụ trong 5 sao với mã số 3, 5, 6, 5, 3 có 4 cặp có khả năng tương hợp là 8.
Dữ liệu vào từ tập tin văn bản FRIEND.INP
-

Dòng đầu tiên ghi 2 số nguyên n, B (2 < n < 105)

-

Mỗi dòng trong n dòng tiếp theo ghi một số nguyên là độ thích nghi của một sao,
độ thích nghi có trị tuyệt đối bé hơn 215

Kết quả xuất ra tập tin văn bản FRIEND.OUT là số nguyên T tìm được
Ví dụ:
FRIEND.INP


FRIEND.OUT


58
3
5
6
5
3
Bài 18: Cặp trung bình

4

Tên file chương trình ‘SUMAVER.???’

Cho một dãy số nguyên a có N phần tử và một số nguyên k.
Yêu cầu: Hãy xác định xem trong dãy a có bao nhiêu cặp số (ai, aj) thỏa mãn k là trung
bình cộng của ai và aj (với i≠j). Biết rằng cặp số (ai, aj) và (aj, ai) chỉ tính là một.
Ví dụ: có dãy số 3 2 5 4 1 và k=4 thì có 1 cặp số (3, 5) thỏa điều kiện.
Dữ liệu vào từ file ‘SUMAVER.INP’
■ Dòng đầu là số nguyên dương n và số nguyên k (n<105, |S|<1018)
■ n dòng tiếp theo, dòng thứ i là phần tử ai (|ai|<109; i=1, 2,...n).
Kết quả ghi vào file ‘SUMAVER.OUT’ số cặp số thỏa mãn điều kiện.
Ví dụ:

SUMAVER.INP
54
3
2
5

4
1
Bài 19: Tổng Chẵn

SUMAVER.OUT
1

Tên file chương trình ‘SUMEVEN.???’

Cho dãy số nguyên gồm n phần tử a1, a2,...an. Người ta chọn trong dãy ra 2 phần tử ai và aj
(i=1, 2,….n; j=1, 2,…n) sao cho iYêu cầu: Cho biết trong dãy có bao nhiêu cặp số (như trên) có tổng là một số chẵn.
Ví dụ: Dãy số có 5 phần tử là 8 3 5 4 7
Có các cặp số
(8, 3); (8, 5); (8, 4); (8, 7); (3, 5); (3, 4); (3, 7); (5, 4); (5, 7); (4, 7).
Có các cặp số (8, 4); (3, 5); (3, 7); (5, 7) có tổng phần tử là một số chẵn.
Dữ liệu vào từ file ‘SUMEVEN.INP’:
■ Dòng đầu chứa số nguyên dương n (n<106).
■ n dòng tiếp theo, dòng thứ i là phần tử ai (i=1, 2,… n; |ai|<1018)


Kết quả ghi vào file ‘SUMEVEN.OUT' số lượng cặp số có tổng là số chẵn.
Ví dụ:

SUMEVEN.INP
5
8
3
5
4

7
Bài 20: Cặp số có tổng lẻ

SUMEVEN.OUT
4

Tên file chương trình ‘SUMODD.???’

Cho một dãy số gồm n số nguyên a1, a2,. an. Biết rằng trong các số đó không có hai số bất
kì nào giống nhau. Người ta chọn trong dãy ra 2 phần tử ai và aj với i=1, 2,…n;
j=1, 2,…n sao cho iYêu cầu: Hãy cho biết với cách chọn như trên thì có thể tạo ra bao nhiêu cặp số có tổng
ai+aj là một số lẻ.
Ví dụ: Ta có các số 3 2 5 4
Sẽ tạo ra các cặp số (3, 2); (3, 5); (3, 4); (2, 5); (2, 4); (5, 4).
Tuy nhiên chỉ có 4 cặp số (3, 2); (3, 4); (2, 5); (5, 4) có tổng là một số lẻ.
Dữ liệu vào từ file ‘SUMODD.INP':
■ Dòng thứ nhất chứa số nguyên dương n (n<106).


n dòng tiếp theo mỗi dòng chứa số nguyên ai (|ai|<109; i=1,2,…n).

Kết quả ghi vào file ‘SUMODD.OUT': một số nguyên duy nhất là số lượng cặp số thỏa
điều kiện.
Ví dụ:

SUMODD.INP
4
3
2

5
4
Bài 21: Cặp số trung hòa

SUMODD.OUT
4

Tên file chương trình ‘NEUTRAL.???’

Cho 2 dãy số nguyên a1, a2... an và b1, b2,... bm. Một cặp số (ai,bj) được gọi là trung hòa
nếu chúng thỏa mãn các điều kiện sau:


■ ai được chọn trong các số nguyên a1, a2 … an (i=1, 2,… n).
■ bj được chọn trong các số nguyên b1, b2,… bm (j=1, 2,…m).
■ ai*bj<0
Yêu cầu: Hãy cho biết có bao nhiêu cách chọn được cặp số trung hòa.
Ví dụ: Có 2 dãy số với các giá trị : Dãy a: 3 -2 0 5; Dãy b: 4 -1 3
Ta có thể chọn ra 4 cặp số trung hòa như sau: (3, -1); (5, -1); (-2, 4); (-2, 3).
Dữ liệu vào từ file ‘NEUTRAL.INP’
■ Dòng thứ nhất chứa số 2 nguyên dương n và m (n, m<105).
■ n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<109; i=1, 2,... n).


m dòng cuối, dòng thứ j chứa số nguyên bj (|bj|<109; j=1, 2,… m).

Kết quả ghi vào file ‘NEUTRAL.OUT’ một số nguyên duy nhất là số cách chọn được cặp số
trung hòa.

NEUTRAL.IN

43
3
-2
0
5
4
-1
3
Bài 22: Tổng lẻ 3 số

NEUTRAL.OU
4

Tên file chương trình ‘SUMODD3.???’

Cho một dãy số gồm n số nguyên a1, a2,... an. Biết rằng trong các số đó không có hai số
bất kì nào giống nhau. Người ta chọn ra ba số bất kì trong đó để tạo ra một bộ số
(ai, aj, ak) với i=1, 2,...n; j=1, 2,...n; k=1, 2,...n và i, j, k khác nhau đôi một.
Yêu cầu: Hãy cho biết với cách chọn như trên thì có thể tạo ra bao nhiêu bộ số (a i, aj, ak)
có tổng ai+aj+ ak là một số lẻ.


Ví dụ: Ta có các số 3 2 5 4
Sẽ tạo ra các bộ số (3, 2, 5); (3, 2, 4); (3, 5, 4); (2, 5, 4).
Tuy nhiên chỉ có 2 bộ số (3, 2, 4); (2, 5, 4) có tổng 3 số là một số lẻ.
Dữ liệu vào từ file ‘SUMODD3.INP’:
■ Dòng thứ nhất chứa số nguyên dương n.
■ n dòng tiếp theo, dòng thứ i chứa số nguyên ai (i=1, 2,.n).

Kết quả ghi vào file ‘SUMODD3.OUT’ một số nguyên duy nhất là số lượng bộ số thỏa

điều kiện.
Ví dụ:
SUMODD3.INP

SUMODD3.OUT

4
3
2
5
4

2

Bài 23: Đoạn con trung bình

Tên file chương trình ‘AVESEQ.???’

Cho một dãy số nguyên a1, a2,.. an.
Yêu cầu: tìm đoạn con dài nhất có giá trị trung bình lớn hơn giá trị k cho trước.
Dữ liệu vào từ file ‘AVESEQ.INP’
■ Dòng đầu ghi số nguyên dương n và số nguyên k
■ n dòng sau, mỗi dòng ghi một số nguyên ai (|ai|<10000).

Kết quả ghi vào file ‘AVESEQ.OUT’ độ dài lớn nhất của dãy con tìm được.
Ví dụ:
AVESEQ.INP
73
1
2

3
5
3
2
1

AVESEQ.OUT
5


Bài 24: Đoạn con giống nhau

Tên file chương trình ‘DOANSAME.???’

Cho một dãy số nguyên gồm n phần tử.
Yêu cầu: Hãy tìm một đoạn liên tiếp các phần tử của dãy số có giá trị bằng nhau và có
nhiều phần tử nhất.
Dữ liệu vào từ file ‘DOANSAME.INP’
■ Dòng đầu là số nguyên n (n<106)
■ Dòng thứ hai ghi n số của dãy (mỗi phần tử có giá trị từ -2*109 đến 2*109)
Kết quả ghi vào file ‘DOANSAME.OUT’ số lượng phần tử bằng nhau liên tiếp nhiều
nhất.
Ví dụ:

DOANSAME.INP
10
1011200022

DOANSAME.OUT
3


Bài 25: Đoạn con tăng dài nhất

Tên file chương trình ‘DOANCON1.???’

Cho một dãy số nguyên a1, a2,... an
Yêu cầu: Hãy tìm đoạn con tăng dài nhất.
Dữ liệu vào từ file ‘DOANCON1.INP’:
■ Dòng đầu là số nguyên dương n (n<106)
■ Dòng thứ 2 là các phần tử của dãy (phạm vi mỗi phần tử từ -1018 đến 1018)
Kết quả ghi vào file ‘DOANCON1.OUT’ số lượng phần tử của đoạn tăng dài nhất.
Ví du:
DOANCON1.INP
6
325649
Bài 26: Đoạn con có tổng lớn nhất

DOANCON1.OUT
3

Tên file chương trình ‘DOANCON2.???’

Cho một dãy số nguyên a1, a2,... an
Yêu cầu: Hãy tìm đoạn con có tổng lớn nhất.
Dữ liệu vào từ file ‘DOANCON2.INP’:
■ Dòng đầu là số nguyên dương n (n<106)
■ Dòng thứ 2 là các phần tử của dãy (phạm vi mỗi phần tử từ -2*109 đến 2*109)


Kết quả ghi vào file ‘DOANCON2.OUT’ tổng lớn nhất tìm được.

Ví du:
DOANCON2.INP
6
3 -4 5 6-8 7
Bài 27: Đoạn có tổng bằng 0

DOANCON2.OUT
11

Tên file chương trình ‘SUM0.???’

Cho dãy số nguyên a1, a2,… an.
Yêu cầu: Hãy cho biết đoạn có tổng bằng 0 có nhiều nhất là bao nhiêu phần tử (các phần
tử này phải nằm liên tiếp nhau trong dãy).
Dữ liệu vào từ file ‘SUM0.INP’:
■ Dòng thứ nhất chứa số nguyên dương n (n<105).
■ n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<105; i=1, 2,…n).
Kết quả ghi vào file ‘SUM0.OUT’ một số nguyên duy nhất là số lượng phần tử.
Ví dụ :

SUM0.INP
5
7
6
-1
-5
4
Bài 28: Đếm đoạn có tổng bằng 0

SUM0.OUT

3

Tên file chương trình ‘SUM0S.???’

Cho dãy số nguyên a1, a2,… an.
Yêu cầu: Hãy cho biết đoạn có tổng bằng 0 có nhiều nhất là bao nhiêu phần tử (các phần
tử này phải nằm liên tiếp nhau trong dãy).
Dữ liệu vào từ file ‘SUM0S.INP’:
■ Dòng thứ nhất chứa số nguyên dương n (n<105).
■ n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<105; i=1, 2,…n).
Kết quả ghi vào file ‘SUM0S.OUT’ một số nguyên duy nhất là số lượng phần tử.


Ví dụ :

SUM0S.INP
5
7
6
-1
-5
5
Bài 29: Đoạn có tổng bằng K

SUM0S.OUT
2

Tên file chương trình ‘SUMK.???’

Cho dãy số nguyên a1, a2,… an.

Yêu cầu: Hãy cho biết đoạn có tổng bằng K có ít nhất là bao nhiêu phần tử (các phần tử
này phải nằm liên tiếp nhau trong dãy).
Dữ liệu vào từ file ‘SUMK.INP’:
■ Dòng thứ nhất chứa số nguyên dương n, k (n<105).
■ n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<105; i=1, 2,…n).
Kết quả ghi vào file ‘SUMK.OUT’ một số nguyên duy nhất là số lượng phần tử.
Ví dụ :

SUMK.INP
55
7
6
-1
-5
5
Bài 30: Đoạn có K phần tử

SUMK.OUT
1

Tên file chương trình ‘SUMMAXK.???’

Cho dãy số nguyên a1, a2,… an.
Yêu cầu: Hãy cho biết đoạn có K phần tử có tổng lớn nhất là bao nhiêu (các phần tử này
phải nằm liên tiếp nhau trong dãy).
Dữ liệu vào từ file ‘SUMMAXK.INP’:
■ Dòng thứ nhất chứa số nguyên dương n, k (n<105).
■ n dòng tiếp theo, dòng thứ i chứa số nguyên ai (|ai|<105; i=1, 2,…n).
Kết quả ghi vào file ‘SUMMAXK.OUT’ một số nguyên duy nhất là số lượng phần tử.



Ví dụ :

SUMMAXK.INP
53
7
6
-1
-5
5
Bài 31: Sắp xếp

SUMMAXK.OUT
12

Tên file chương trình ‘SORT.PAS’

Cho một dãy X gồm n số nguyên trong phạm vi từ -105 đến 105.
Yêu cầu: Hãy sắp xếp dãy số này theo thứ tự tăng.
Dữ liệu vào được lấy từ file văn bản ‘SORT.INP’ trong đó:



Dòng đầu chứa số nguyên dương n (n<106).
Dòng thứ i trong n dòng tiếp theo chứa số thứ i trong dãy X.

Kết quả ghi vào file ‘SORT.OUT’ trong đó lần lượt ghi ra các phần tử của dãy X đã được
sắp xếp mỗi số trên một dòng.
Ví dụ:
5

4
7
2
9
1

SORT.INP

Bài 32: Fibo

1
2
4
7
9

SORT.OUT

Tên file chương trình ‘FIBO9.???’

Xét dãy F gồm n số nguyên F=f f2,..fn) được định nghĩa như sau:
■ f(i)=1 nếu i<2;
■ f(i)= (f(i-1)+ f(i-2)) mod 100, nếu 2
Yêu cầu: Hãy cho biết nếu dãy f sắp xếp theo thứ tự tăng thì số thứ k có là bao nhiêu?
Dữ liệu vào từ file ‘FIBO9.INP’ chứa 2 số nguyên dương n và k (1Kết quả ghi vào file ‘FIBO9.OUT’ số thứ k tìm được.
Ví dụ:

FIBO9.INP

10 6

FIBO9.OUT
8


Bài 33: Xóa số

Tên file chương trình ‘DELNUM.???’

Một chương trình máy tính tạo ra một dãy số nguyên gồm n số a1, a2,... an khác nhau đôi
một. Tuy nhiên, do một nguyên nhân nào đó (lỗi phần mềm hay do Virus) mà trong dãy
số được tạo ra không như mong muốn, có rất nhiều số được tạo ra bị lặp lại một số lần.
Nam là một người đam mê bộ môn tin học, Nam đã dùng chương trình tự viết của mình
xóa đi các số bị lặp lại nhiều lần để chỉ giữ lại một lần.
Yêu cầu: Với dãy số được tạo ra thì cần xóa đi ít nhất bao nhiêu phần tử để dãy số còn lại
các phần tử đôi một khác nhau.
Dữ liệu vào từ file ‘DELNUM.INP’ có nội dung như sau:
■ Dòng đầu là số nguyên dương n (n<106)
■ Trong n dòng sau, dòng thứ i là số nguyên ai (i=1, 2,... n; |ai|<105)
Kết quả ghi vào file ‘DELNUM.OUT’ một số duy nhất là số lượng số cần xóa ít nhất.
Ví dụ:
DELNUM.INP
6
3
2
1
2
3
2

Bài 34: Tìm số

DELNUM.OUT
3

Tên file chương trình ‘SEARCH.???’

Trong quá trình viết phần mềm quản lý, người lập trình thường gặp phải vấn đề với
những mã số quản lý của các đối tượng trong phần mềm (ví dụ như mã số của nhân viên,
của phòng). Ở đây ta xem xét một bài toán đặt ra là: trong quá trình viết phần mềm quản
lý nhân sự cho một công ty, mỗi nhân viên được phần mềm gắn cho một mã số (mã số
không được trùng nhau giữa 2 nhân viên bất kỳ) được đánh số lần lượt là 1, 2, 3, 4. Tuy
nhiên, có trường hợp là có một số nhân viên sau một thời gian sẽ nghỉ và phải tuyển nhân
viên mới vào. Nhân viên mới cũng được phần mềm gắn cho một mã số.
Yêu cầu: với n mã số hiện có. Hãy tìm ra mã số bé nhất có thể gắn cho nhân viên mới.


Dữ liệu vào từ file ‘SEARCH.INP’:
■ Dòng đầu là số nguyên dương n (1■ N dòng tiếp theo mỗi dòng chứa một mã số ai (1Kết quả ghi vào file ‘SEARCH.OUT’ ghi mã số tìm được.
Ví dụ:
SEARCH.INP

SEARCH.OUT
4

5
2
3

1
5
7
Bài 35: Xuất hiện nhiều nhất

Tên file chương trình ‘APPMAX.???’

Cho dãy số nguyên, dãy A có n phần tử: a1, a2,..an
Yêu cầu: Hãy cho biết giá trị xuất hiện nhiều nhất trong dãy số A là bao nhiêu lần?
Dữ liệu vào từ file APPMAX.INP
■ Dòng đầu là số nguyên dương n (n<106)
■ n dòng tiếp theo, dòng thứ i là số nguyên ai(|ai|<105; i=1,2,…n)
Kết quả ghi vào file APPMAX.OUT một số nguyên duy nhất là số lần xuất hiện nhiều
nhất.
Ví dụ:
APPMAX.INP
5
2
5
2
1
2
Bài 36: Alibaba

APPMAX.OUT
3

Tên file chương trình ‘ALIBABA.???’

Sau nhiều lần vào hang động và lấy đi những món đồ của bọn cướp phân phát cho người

dân, Một lần nọ Alibaba đã bị bọn cướp bắt. Biết được Alibaba là người tốt, tên tướng
cướp quyết định thả cho Alibaba ra về và đồng thời cũng cho mang theo một số cổ vật
trong hang động đi.


Trong hang động có n cổ vật mà tên tướng cướp muốn cho Alibaba, cổ vật thứ i có mã số
là ai (là một số nguyên). Tên tướng cướp chỉ cho phép Alibaba được mang đi mỗi mã số
một cổ vật duy nhất mà thôi.
Yêu cầu: Hãy cho biết Alibaba phải gửi trả lại ít nhất bao nhiêu cổ vật.
Dữ liệu vào từ file ‘ALIBABA.INP’ có nội dung như sau:
■ Dòng đầu là số nguyên dương n (n<106)
■ Trong n dòng sau, dòng thứ i là số nguyên ai (i=1, 2,... n; |ai|<105)
Kết quả ghi vào file ‘ALIBABA.OUT’ một số duy nhất là số lượng cổ vật ít nhất phải
trả lại.
Ví dụ:

ALIBABA.INP
7
8
5
2
8
7
5
8
Bài 37: k giá trị lớn nhất

ALIBABA.OUT
3


Tên file chương trình ‘MAXK.???’

Cho một dãy số nguyên dương n phần tử a1, a2, ...an .
Yêu cầu: Tìm k giá trị lớn nhất khác nhau trong dãy số trên.
Dữ liệu vào file MAXK.INP
■ Dòng đầu chứa 2 số nguyên dương n và k (2■ n dòng sau, dòng thứ i chứa giá trị của phần tử ai (ai<109)
Dữ liệu ra file MAXK.OUT gồm k dòng, dòng thứ i chứa giá trị lớn thứ i.
Ví du:
MAXK.INP
53
2
7
5
4
7

MAXK.OUT
7
5
4


Bài 38: Giá trị lớn nhất

Tên file chương trình ‘MAX.???’

Cho một dãy số nguyên có n phần tử a1, a2,… an.
Yêu cầu: Hãy tìm giá trị lớn nhất của dãy số sao cho giá trị đó không bằng một
phần tử nào khác.

Dữ liệu vào từ file MAX.INP:
■ Dòng đầu là số nguyên dương n (n<105).
■ Trong n dòng tiếp, dòng thứ i ghi số nguyên aj (|ai|<109).
Kết quả ghi vào file MAX.OUT ghi giá trị lớn nhất tìm được.
Ví dụ:

MAX.INP
5
7
3
-2
7
1
Bài 39: k số nhỏ nhất khác nhau

MAX.OUT
3

Tên file chương trình ‘KMIN.???’

Cho một dãy số nguyên có n phần tử a1, a2,... an.
Yêu cầu: Hãy tìm k giá trị nhỏ nhất của dãy số sao cho các giá trị đó không bằng một
phần tử nào khác.
Dữ liệu vào từ file KMIN.INP:
■ Dòng đầu là số nguyên dương n và k (n<10 ; k<104).
■ Trong n dòng tiếp, dòng thứ i ghi số nguyên ai (|ai|<109).
Kết quả ghi vào file KMIN.OUT ghi k giá trị nhỏ nhất tìm được theo thứ tự tăng dần.
Ví dụ:

KMIN.INP

72
3
8
3
7
9
2
7

KMIN.OUT
2
8


×