Tải bản đầy đủ (.pdf) (30 trang)

Skkn kỹ thuật làm mịn chương trình

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 (433.76 KB, 30 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO YÊN BÁI
TRƯỜNG TRUNG HỌC PHỔ THÔNG HƯNG KHÁNH

BÁO CÁO SÁNG KIẾN CẤP CƠ SỞ
LĨNH VỰC: TIN HỌC
TÊN SÁNG KIẾN

KỸ THUẬT LÀM MỊN CHƯƠNG TRÌNH

Tác giả: CAO DANH THẠCH
Trình độ chun mơn: Đại học Cơng nghệ Thông tin
Chức vụ: Giáo viên
Đơn vị công tác: Trường Trung học phổ thông Hưng Khánh

Yên Bái, ngày 19 tháng 01 năm 2022


2

MỤC LỤC

I. THÔNG TIN CHUNG VỀ SÁNG KIẾN ........................................................... 3
1. Tên sáng kiến: .................................................................................................. 3
2. Lĩnh vực áp dụng sáng kiến: ............................................................................ 3
3. Phạm vi áp dụng sáng kiến: ............................................................................. 3
4. Thời gian áp dụng sáng kiến:........................................................................... 3
5. Tác giả:............................................................................................................. 3
II. MƠ TẢ SÁNG KIẾN: ........................................................................................ 3
1. Tình trạng các giải pháp đã biết....................................................................... 3
2. Nội dung giải pháp đề nghị cơng nhận là sáng kiến: ....................................... 4
Bài A. Tìm ước GCD.* ....................................................................................... 5


Bài B. SỐ ĐẸP .................................................................................................... 8
Bài C. GIẢI PHƯƠNG TRÌNH ........................................................................ 11
Bài D. TÍCH CÁC CHỮ SỐ ............................................................................. 14
Bài E. SỐ NGHỊCH THẾ ................................................................................. 17
Bài F. Tìm ước chung lớn nhất ......................................................................... 18
Bài G. Sắp xếp dãy số ....................................................................................... 20
Bài H. Vị trí số nguyên tố ................................................................................. 22
Bài I. Xâu con đối xứng dài nhất ...................................................................... 23
Bài J. Chọn số ................................................................................................... 24
3. Khả năng áp dụng của giải pháp .................................................................. 288
4. Hiệu quả, lợi ích thu được hoặc dự kiến có thể thu được do áp dụng giải
pháp ...................................................................................................................... 28
5. Các điều kiện cần thiết để áp dụng sáng kiến .............................................. 299
III.

Cam kết không sao chép hoặc vi phạm bản quyền ........................................ 30

IV.

TÀI LIỆU THAM KHẢO ............................................................................. 30


3

I. THÔNG TIN CHUNG VỀ SÁNG KIẾN
1. Tên sáng kiến:
KỸ THUẬT LÀM MỊN CHƯƠNG TRÌNH
2. Lĩnh vực áp dụng sáng kiến:
Tin học.
3. Phạm vi áp dụng sáng kiến:

Sáng kiến áp dụng dạy môn Tin học 11 và dạy bồi dưỡng học sinh giỏi
môn Tin học.
4. Thời gian áp dụng sáng kiến:
Từ ngày 25 tháng 8 năm 2020 đến ngày 18 tháng 01 năm 2022.
5. Tác giả:
Họ và tên: Cao Danh Thạch
Năm sinh: 1973
Trình độ chun mơn: Đại học
Chức vụ cơng tác: Giáo viên Tin học
Nơi làm việc: Trường THPT Hưng Khánh.
Địa chỉ liên hệ: Cao Danh Thạch, giáo viên Tin học, trường THPT Hưng
Khánh.
Điện thoại: 0969991672
II. MÔ TẢ SÁNG KIẾN:
1. Tình trạng các giải pháp đã biết
Các bài tốn lập trình tối ưu ngày càng được quan tâm nghiên cứu, phát
triển, ứng dụng trong khoa học và cuộc sống. Trong những năm gần đây, các bài
tốn về lập trình tối ưu xuất hiện nhiều trong các đề thi giỏi các cấp. Một trong
những cách tiếp cận các bài toán này là kỹ thuật làm mịn chương trình.
Nắm vững được các kỹ thuật làm mịn chương trình, học sinh sẽ có được
những kĩ năng cần thiết để làm tốt nhất các bài tốn lập trình trong mơn Tin học
11. Đồng thời, sáng kiến kinh nghiệm này là nguồn tài liệu bổ ích, quý giá cho
giáo viên dạy bồi dưỡng học sinh giỏi môn Tin học.


4

Hiện nay những tài liệu viết về kỹ thuật làm mịn chương trình khơng nhiều,
nếu có thì chủ yếu tập trung về lí thuyết và thuật tốn. Trong khi việc mơ tả một
thuật tốn mới bằng ngơn ngữ lập trình Pascal địi hỏi người học phải có kĩ năng

cài đặt tốt mới cài đặt thành cơng thuật tốn, mà học sinh chưa có đủ kĩ năng
như vậy. Yêu cầu đặt ra là: Tài liệu về kỹ thuật làm mịn chương trình mà nội
dung về phương pháp rõ ràng, có mã nguồn tham khảo dễ hiểu, hệ thống bài tập
định hướng rèn luyện kỹ năng cài đặt, kĩ năng phát hiện thuật toán tối ưu để giải
quyết các bài toán lập trình.
Giáo viên và học sinh có thể sử dụng tài liệu này kết hợp với sách giáo khoa
Tin học 11 một cách hiệu quả.
Trong phạm vi sáng kiến kinh nghiệm của mình tơi xin đề cập đến các bài
tốn áp dụng kĩ thuật làm mịn chương trình.
Phạm vi giới hạn của sáng kiến:
- Kỹ thuật làm mịn chương trình.
- Các bài tốn áp dụng kỹ thuật làm mịn chương trình.
- Hình thành những kĩ năng cần thiết cho học sinh khi tiếp cận với bài tốn
lập trình.
2. Nội dung giải pháp đề nghị công nhận là sáng kiến:
Chúng ta biết rằng: Khi học môn Tin học 11, học sinh được học tư duy lập
trình cùng với một ngơn ngữ lập trình cụ thể. Ở đây là ngơn ngữ lập trình Pascal,
tương lai là ngơn ngữ lập trình C++ và Python. Ở mỗi bài tốn, ln có thuật
tốn đơn giản để xử lí và có một hoặc nhiều thuật tốn tốt hơn để giải quyết bài
tốn trọn vẹn.
Mơ hình của kĩ thuật làm mịn chương trình như sau:


5

Bài toán 0

Bài toán i

bài toán

1

thuật
toán i1

bài toán
2

thuật
toán i2

...

...

bài toán
N

thuật
toán iM

Mỗi bài toán, được chia thành các bài toán nhỏ. Ở mỗi bài toán nhỏ là các
bài toán cơ sở hoặc có thể chia thành các bài tốn nhỏ hơn.
Khi giải quyết bài tốn gốc (bài tốn 0) ta có thể cài đặt bằng thuật toán
cơ bản. Khi chia thành các bài tốn con thì các bài tốn con, ta giải quyết một
phần hoặc trọn vẹn bằng thuật toán tối ưu. Từ đó bài tốn 0 sẽ được giải quyết
bằng thuật toán tốt nhất.
Việc chia bài toán 0 thành bài tốn nhỏ trên cơ sở tìm kiếm thuật tốn tốt
hơn để giải quyết nó.
Áp dụng kỹ thuật làm mịn chương trình để giải các bài tốn sau, sẽ giúp

hình thành tư duy lập trình và kỹ năng cài đặt chương trình cho học sinh:
Bài A. Tìm ước GCD.*
Cho số nguyên dương N (N ≤ 108). Liệt kê các ước nguyên tố của N.
Ví dụ: N = 10; Các ước nguyên tố 2, 5.
Ý tưởng thuật toán:
Subtask1: Duyệt I từ 1 tới N, nếu I là ước của N và I nguyên tố thì đưa I ra.
For i:=1 to n do
If (n mod I = 0) and (nguyento(i) = true) then write(I,#32);


6

Độ phức tạp thuật tốn: Vịng For ngồi mất N phép tính, với mỗi I ta kiểm tra
tính nguyên tố mất √𝑁 phép tính. Vậy độ phức tạp là O(N. √𝑁)
Làm theo cách này học sinh chỉ chạy được với N ≤ 104. Không đạt điểm tối đa
của bài.
Ở cách trên ta cũng tổ chức hàm kiểm tra tính nguyên tố (bài toán con).
Tuy nhiên thuật toán trên chưa thực sự tốt.
Subtask2:
Bổ đề:
1. Nếu I là ước của N thì:
N mod I = 0 và N mod (N div I) = 0.
Ví dụ: 100 chia hết cho 2, thì 100 cũng chia hết cho phần còn lại là 50.
2. I khác 1, bé nhất nếu có, là ước của N thuộc đoạn [2, √𝑁].
Vậy ta thực hiện: Duyệt I từ 1 tới √𝑁, nếu I là ước của N thì:
+ I nguyên tố thì đẩy I vào mảng C[k].
+ Nếu (I <> N div I) và nguyento(N div i) = true thì đẩy N div I vào C[k];
Sắp xếp mảng lưu nghiệm C[k] thành dãy không giảm, đưa mảng C[k] ra.
Độ phức tạp thuật tốn: Vịng For ngồi mất √𝑁 phép tính, với mỗi I ta
kiểm tra tính nguyên tố mất √𝑁 phép tính. Vậy độ phức tạp là O(N).

Làm theo cách này học sinh chỉ chạy được với N ≤ 106. Không đạt điểm
tối đa của bài.
Subtask3: Ta nhận thấy: số 100 = 2.2.5.5 và các ước nguyên tố của N là 2 và 5.
Số 26 = 2.13 và có các ước nguyên tố là 2 và 13. Vậy, với số N ta phân tích N
thành tích các thừa số nguyên tố lưu vào mảng C.
Sắp xếp mảng C thành dãy không giảm, nén mảng C thành mảng D chứa
các C[i] khác nhau. Đưa mảng D ra.
Chỗ này, ta có thể xử lí khéo léo chỗ tạo mảng C là chỉ lưu các phần tử
khác nhau vào mảng C.
Ta tổ chức thủ tục phân tích số N thành tích các thừa số nguyên tố.
uses math;


7

var n,i,k:longint;
c:array[-1..100007] of longint;
procedure nhapdl;
begin
assign(input,'GCD.INP'); reset(input);
assign(output,'GCD.OUT'); rewrite(output);
readln(n);
end;
procedure phantich(u:longint);
begin
i:=2;
while (i*i)<=u do
begin
while (u>0) and (u mod i=0) do
begin

if c[k] <> I then
begin
inc(k);
c[k]:=i;
end;
u:=u div i;
end;
inc(i);
end;
if u>1 then
begin
inc(k);
c[k]:=u;
end;


8

end;
begin
nhapdl;
k:=0;
phantich(n);
for i:=1 to k do
write(c[i],#32);
close(input);
close(output);
end.

Độ phức tạp thuật toán: O(√𝑁).

Làm theo cách này học sinh chỉ chạy được với N ≤ 108. Đạt điểm tối đa
của bài.
Bài B. SỐ ĐẸP
Một số được gọi là đẹp nếu tổng bình phương các chữ số của nó (trong
dạng biểu diễn thập phân) là một số nguyên tố.
Ví dụ, 12 là một số đẹp vì 12+22 = 5 – số nguyên tố. Các số đẹp được
đánh số theo thứ tự tăng dần của giá trị, bắt đầu từ 1 trở đi.
Yêu cầu: Cho số nguyên n (1 ≤ n ≤ 10000). Hãy tìm số đẹp thứ n.
Dữ liệu: Vào từ file văn bản BEAUTY2.INP, gồm nhiều tests, mỗi test
cho trên một dòng chứa một số nguyên n.
Kết quả: Đưa ra file văn bản BEAUTY2.OUT, kết quả mỗi test đưa ra
trên một dịng.
Ví dụ:
BEAUTY2.INP

BEAUTY2.OUT

1

11

2

12

6

23



9

Ý tưởng thuật toán:
Từ bài toán 0 ta sẽ tổ chức chương trình gồm:
Hàm tính tổng bình phương các chữ số của U. Độ phức tạp thuật toán
O(loglogU).
Vấn đề đặt ra hàm kiểm tra tính nguyên tố của U.
Dựa vào định nghĩa: Số nguyên tố là số nguyên dương > 1 và có hai ước.
Subtask1: Hàm kiểm tra tính ngun tố của U
Duyệt I từ 1 tới U:
nếu U chia hết cho I thì kt:= false;
kt:= true;
Với mỗi số nguyên dương U ta phải For tới U vì thế độ phức tạp thuật
toán của cách này là O(U).
Độ phức tạp chung: O(U.loglogU) cho đoạn kiểm tra số đó là số đẹp.
Subtask2: Hàm kiểm tra tính nguyên tố của U
Duyệt I từ 2 tới U div 2:
nếu U chia hết cho I thì kt:= false;
kt:= true;
Với mỗi số nguyên dương U ta phải For tới U div 2 vì thế độ phức tạp
thuật toán của cách này là O(U div 2).
Độ phức tạp chung: O((U div 2).loglogU) cho đoạn kiểm tra số đó là số
đẹp.
Subtask3: Với mỗi số nguyên U > 1, nếu U có ước ngồi 1 và U ra thì I là ước
của I nếu có thì I thuộc đoạn [2, √𝑈]. Khi đó, U sẽ có 3 ước là: 1, I và U. U
không là số nguyên tố.
Với mỗi số nguyên dương U ta phải For tới √𝑈 vì thế độ phức tạp thuật
tốn của cách này là O(√𝑈.loglogU) để kiểm tra U là số đẹp.
Làm cách này ta đạt điểm tối đa của bài.
uses math;



10

var a:array[-1..100007] of longint;
n,i:longint;
function NT(x:longint):boolean;
var j:longint;
begin
if (x<2) then exit(false);
if (x=2) and (x=3) then exit(true);
for j:=2 to trunc(sqrt(x)) do
if x mod j=0 then exit(false);
exit(true);
end;
function TBP(u:longint):boolean;
var s:longint;
begin
s:=0;
while u>0 do
begin
s:=s+sqr(u mod 10);
u:=u div 10;
end;
if nt(s) then exit(true) else exit(false);
end;
function TIMSD(x:longint):int64;
var d,p:longint;
begin
d:=0;

p:=1;
while dbegin


11

while tbp(p)=false do
inc(p);
inc(d);
inc(p);
end;
exit(p-1);
end;
begin
assign(input,'BEAUTY2.INP'); reset(input);
assign(output,'BEAUTY2.OUT'); rewrite(output);
while not eof(input) do
begin
readln(n);
writeln(TIMSD(n));
end;
close(input);
close(output);
end.
Bài C. GIẢI PHƯƠNG TRÌNH
Cho phương trình

ax + b
=v

cx + d
Trong đó x là ẩn số của phương trình, cịn a, b, c, d, v là các số nguyên,
mỗi số có giá trị tuyệt đối khơng vượt q 1 000.
u cầu: Tìm và đưa ra nghiệm phương trình dưới dạng X = p/q, trong đó p, q là
các số nguyên và nguyên tố cùng nhau. Nếu phương trình vơ nghiệm thì đưa ra
thơng báo NONE, trong trường hợp vô định – đưa ra thông báo MULTIPLE.


12

Dữ liệu: Vào từ file văn bản EQUATION.INP gồm nhiều tests, mỗi test cho trên
một dòng chứa 5 số nguyên a, b, c, d và v.
Kết quả: Đưa ra file văn bản EQUATION.OUT, mỗi kết quả đưa ra trên một
dịng.
Ví dụ:
EQUATION.INP

EQUATION.OUT

12345

X = -9/7

11111

MULTIPLE

Ý tưởng thuật tốn:
Ta biến đổi phương trình trên về phương trình bậc nhất một ẩn X.
Ax + b = vcx + dv  (a-vc).x + (b-v.d) = 0 (1)

Đặt p = (a-vc); q = (b-v.d)
Phương trình (1) tương đương: p.x + q = 0;
Ta giải và biện luận phương trình bậc nhất một ẩn. Áp dụng vào bài Cấu trúc rẽ
nhánh trong chương trình Tin học 11.
Nếu p = 0 và q = 0 thì phương trình vô số nghiệm.
Nếu p = 0 và q <> 0 thì phương trình vơ nghiệm.
Nếu p <> 0 thì phương trình có nghiệm:
+ ta xử lí rút gọn phân số -q/p.
Để làm điều này, ta thực hiện tìm Ước chung lớn nhất của P và Q.
Trước đó ta xử lí lưu dấu của phân số vào biến dấu.
Vấn đề đặt ra ở chỗ giải thuật: Tìm ước chung lớn nhất của số nguyên dương U
và V tổng quát.
Subtask1: Chừng nào U khác V thì thực hiện:
nếu U>V thì U := U – V ngược lại V:= V- U;
Sau vòng lặp, ước chung lớn nhất của U và V bằng U.
Làm theo cách này, độ phức tạp thuật toán O(max(U,V)). Chỉ chạy được với
𝑈 , 𝑉 ≤ 106 .


13

Subtask2: Áp dụng giải thuật Ơ’clit để tìm ước chung lớn nhất của số nguyên
dương U và V
Chừng nào V > 0 thực hiện:
Begin
R := u mod v;
U := v;
V := r;
End;
Độ phức tạp thuật toán O(log(max(U,V)).

uses crt;
var g:array[-1..100007] of longint;
a,b,c,d,v:longint;
procedure nhapdl;
begin
assign(input,'EQUATION.INP'); reset(input);
assign(output,'EQUATION.OUT'); rewrite(output);
readln(a,b,c,d,v);
end;
function UCLN(x,y:longint):longint;
var r:longint;
begin
r:=y mod x;
while r<>0 do
begin
r:=x mod y;
x:=y;
y:=r;
end;
exit(x);


14

end;
procedure xl;
var p,q,dau,ts,ms,k:longint;
begin
p:=a-v*c;
q:=v*d-b;

if (p=0) and (q=0) then write('MULTIPLE');
if (p=0) and (p<>0) then write('NONE');
if (p<>0) then
begin
TS:=q;
MS:=p;
if TS*MS>0 then dau:=1 else dau:=-1;
TS:=abs(ts); Ms:=abs(Ms);
k:=UCLN(ts,ms);
ts:=ts div k;
ms:=ms div k;
if (-d/c=dau*TS/MS) then write('NONE')
else write('X=',dau*TS,'/',MS);
end;
end;
begin
nhapdl;
xl;
close(input);
close(output);
end.
Bài D. TÍCH CÁC CHỮ SỐ


15

Cho hai số nguyên l và r thỏa mãn điều kiện 1 ≤ l ≤ r ≤ 109, r – l ≤ 105.
Yêu cầu: Hãy xác định số lượng các số nguyên trong khoảng [l, r] chia hết cho
tích các chữ số của mình (trong dạng biểu diễn thập phân).
Dữ liệu: Vào từ file văn bản PRODUCT.INP gồm một dòng chứa hai số nguyên

l và r.
Kết quả: Đưa ra file văn bản PRODUCT.OUT số lượng số tìm được.
Ví dụ:
PRODUCT.INP

PRODUCT.OUT

1 12

11

Ý tưởng thuật tốn:
Subtask1: Tổ chức hàm tính tích chữ số của U. Bài toán này áp dụng dạy phần
bài tập câu lệnh lặp với số lần lặp chưa xác định trong môn Tin học 11.
uses crt;
var a:array[-1..100007] of longint;
i,l,r:longint;
procedure nhapdl;
begin
assign(input,'PRODUCT.INP'); reset(input);
assign(output,'PRODUCT.OUT'); rewrite(output);
readln(l,r);
end;
function TICHCS(x:longint):longint;
var t,k:longint;
begin
k:=1;
while x>0 do
begin
t:=x mod 10;



16

k:=k*t;
x:=x div 10;
end;
exit(k);
end;
procedure xl;
var res,h:longint;
begin
res:=0;
for i:=l to r do
if (TICHCS(i)<>0) and (i mod TICHCS(i)=0) then
inc(res);
writeln(res);
end;
begin
nhapdl;
xl;
close(input);
close(output);
end.
Subtask2: Với N ≤ 106, ta có thể tính trước được số I là số thoả mãn chia hết
cho tích của mình (*).
Khi đó gọi F[i] là số lượng số thoả mãn (*) từ 1 tới i.
Ta có F[1] = 1;
For i:= 1 to N do
Nếu sodep(i) thì F[i] := F[i-1] + 1

Ngược lại F[i] := F[i-1];
Với mỗi bộ số [L, R] thì số lượng số thoả mãn (*) là F[R] – F[L-1].


17

Ta đưa kết quả ra.
Bài toán sử dụng kiểu tổng tiền tố này giúp giải quyết các bài có tính multiple
test.
Bài E. SỐ NGHỊCH THẾ
Xét dãy số nguyên A = (a1, a2, . . ., an,)(1 ≤ n ≤ 100 000). Các số trong dãy A
khác nhau từng đôi một và nhận giá trị trong phạm vi từ 1 đến n. Như vậy dãy A
là một hoán vị các số từ 1 đến n. Cặp số (ai, aj)trong dãy A được gọi là một
nghịch thế, nếu i < j và ai > aj.
Yêu cầu: Cho n và hoán vị A. Hãy xác định số nghịch thế.
Dữ liệu: Vào từ file văn bản INVERS.INP:
• Dịng đầu tiên chứa số ngun n,
• Dịng thứ 2 chứa n số ngun xác định hốn vị A.
Kết quả: Đưa ra file văn bản INVERS.OUT một số ngun – số lượng nghịch
thế.
Ví dụ:
INVERS.INP

INVERS.OUT

5

5

24351

Ý tưởng thuật tốn:
Subtask1: Tổ chức hàm check(u,v:longint): boolean; để kiểm tra a[u] < a[v] và
u < v hay không.
For u:=1 to N do
for v :=1 to N do
nếu check(u,v) = true thì tăng đếm lên.
Độ phức tạp O(N2).
Subtask2: Khơng mất tính tổng qt, ta sắp xếp dãy số thành dãy không giảm và
lưu chỉ số.
Duyệt từ 1 tới N ta chặt nhị phân tìm phần tử bé nhất lớn hơn a[i] và có chỉ
số[res] > chiso[a[i]] thì tăng đếm lên.


18

Chi phí chặt nhị phân là O(logN).
Vịng For ngồi mất O(N). Vậy chi phí chung là O(N.logN).
uses math;
var a:array[-1..100007] of longint;
i,n,j,res:longint;
procedure nhapdl;
begin
assign(input,'INVERS.INP'); reset(input);
assign(output,'INVERS.OUT'); rewrite(output);
readln(n);
for i:=1 to n do
read(a[i]);
end;
procedure xl;
begin

res:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]write(res);
end;
begin
nhapdl;
xl;
close(input);
close(output);
end.
Bài F. Tìm ước chung lớn nhất


19

Cho a, b, c nguyên dương. Hãy tìm ước chung lớn nhất của a, b và c.
GCD.INP GCD.OUT
468

2

Thuật tốn:
• Sub1: gọi d là ước chung lớn nhất của a, b và c. Khi đó giá trị của d thuộc
đoạn [1,min(a,b,c)].
Tìm min của a, b,c: rmin := min(a, min(b,c)); // nhớ dùng thư viện toán học
Res :=1;
For(i,1,rmin)
If (a mod i = 0) and (b mod i = 0) and (c mod i = 0) then res :=i;

Đưa res ra.
Độ phức tạp thuật toán: O(min(a,b,c));
Sử dụng thuật toán này ta chỉ đạt khơng q 50% điểm của bài.
• Sub2: Ta tổ chức hàm tìm ước chung lớn nhất của u và v nguyên dương
theo thuật toán ơ’clit.
Function GCD(u, v: longint): longint;
Var r: longint; // r là số dư của u chia cho v
Begin
While v>0 do
Begin
R:= u mod v;
U:= v;
V:=r;
End;
Exit(u);
End;
Kết quả của bài toán: res:= gcd(a,gcd(b,c));
Độ phức tạp thuật toán: O(logloga);
NOTE:


20

• Tổng qt lên, để tìm GCD của dãy a1, a2, …, aN. Ta gắn res := a[1];
For(i,2,N) res:=gdc(res,a[i]);
• Bội chung nhỏ nhất của a và b là: a*b div GCD(a,b); Tổng qt lên ta
cũng có thể tìm BCNN của N phần tử.
Bài G. Sắp xếp dãy số
Cho N và dãy a1, a2,…,aN. Hãy sắp xếp dãy này thành dãy khơng. Đưa
dãy sau khi sắp xếp ra.

Ví dụ: N = 6; dãy 1 3 4 2 7 3 → 1 2 3 3 4 7
Thuật toán:
Subtask1: Sử dụng thuật toán sắp xếp nổi bọt.
For i:=1 to n-1 do
For j:=1 to n do
Nếu a[i] > a[j] thì đổi chỗ (a[i],a[j]).
Độ phức tạp thuật toán: O(N2).
Subtask2:
Ta sử dụng thuật toán Sắp xếp nhanh Quicksort để sắp xếp dãy số thành dãy
không giảm.
Ta nên cố định code sắp xếp nhanh như sau:
Procedure qsort(L, H:longint);
Var i,j,mid, temp:longint;
Begin
If (L>H) then exit();
I:=L;
J:=H;
Mid:=a[(i+j) div 2];
While i<=j do
Begin
While a[i]While a[j]>mid do dec(j);



×