//
you're reading...
Dùng cho thi học sinh giỏi

Tài liệu lớp chuyên 10 – chương IV: Mảng (Array)

A – Tóm tắt lý thuyết


I / Định nghĩa


Mảng là tập hợp các phần tử cùng kiểu . Kiểu của các phần tử như mọi kiểu của biến (trừ kiểu File ) .


II/ Cách khai báo mảng 1 chiều


Có hai cách khai báo :
Cách 1 :
TYPE Tên_Kiểu_Mảng = ARRAY[chỉ_số_đầu . . chỉ_số_cuối] of Kiểu_Phần_tử ;
VAR Tên_biến_Mảng : Tên_Kiểu_Mảng ;
Cách 2 :
VAR Tên_biến_Mảng : ARRAY[chỉ_số_đầu . . chỉ_số_cuối] of Kiểu_Phần_tử ;

Lưu ý :
Khi truyền dữ liệu kiểu mảng vào trong chương trình con bắt buộc phải dùng cách 1


III / Cách khai báo mảng 2 chiều


Tương tự cũng có 2 cách khai báo :
Cách 1 :
TYPE Tên_Kiểu_Mảng = ARRAY[m1 . . m2,n1 . . n2] of Kiểu_Phần_tử ;
VAR Tên_biến_Mảng : Tên_Kiểu_Mảng ;
Cách 2 :
VAR Tên_biến_Mảng : ARRAY[m1 . . m2,n1 . . n2] of Kiểu_Phần_tử ;

Lưu ý : m1 là chỉ số dòng đầu và m2 chỉ số dòng cuối
n1 là chỉ số cột đầu và n2 chỉ số cột cuối


IV / Cách truy nhập Mảng


Kí hiệu mảng 1 chiều có N phần tử là A(N). Kí hiệu phần tử thứ i ( 1 <= i <= N ) của mảng là A[i] . Trong chương trình , A[i] có vai trò như một biến mang giá trị của ô nhớ tương ứng với phần tử thứ i của mảng . Vậy muốn truy nhập (lấy ra hoặc đặt lại ) giá trị của phần tử thứ i của mảng 1 chiều A(N) ta chỉ cần truy nhập qua A[i] . Rõ ràng rất thuận tiện .
Kí hiệu mảng 2 chiều có M dòng ,N cột A(M,N) . Số phần tử là MxN Kí hiệu phần tử ở dòng i ( 1 <= i <= M ) , cột j ( 1 <= j <= N ) của mảng là A[i,j] . Chỉ số i gọi là chỉ số dòng , chỉ số j gọi là chỉ số cột . Chú ý chỉ số dòng viết trước.
Trong chương trình , A[i,j] có vai trò như một biến ,mang giá trị của ô nhớ tương ứng với phần tử ở dòngi , cột j của mảng . Vậy muốn truy nhập (lấy ra hoặc đặt lại ) giá trị của phần tử này chỉ cần truy nhập qua A[i,j] .


V / Chuyển đổi mảng 2 chiều vào mảng 1 chiều


Để chuyển giá trị của các phần tử của mảng 2 chiều A(M,N ) vào mảng 1 chiều B(M*N) ta dùng công thức sau :

B[k] := A[i,j] với k := (i – 1) * N + j ( 1<=i<=M ; 1<=j <= N )


VI / Kích thước của mảng


+ Cách 1 : Mảng A có kích thước là : Sizeof(A) Byte
+ Cách 2 : Kích thước Mảng = Kích thước 1 phần tử * Số lượng phần tử .


VII / Vấn đề mảng và tự điển


Trong một số bài tập , việc tổ chức mảng như thế nào để có thể làm việc với bộ dữ liệu lớn là một yêu cầu cần thiết . Thí dụ : Cho một bảng chữ nhật 2×4 gồm 2 dòng , 4 cột chứa 8 ô vuông , mỗi ô chứa 1 số nguyên khác nhau 1 , 2 ,3 ,4 ,5 ,6 ,7 8 .

Hình 1
1 2 3 4
8 7 6 5

Hình 2
4 1 2 3
5 8 7 6

Hình 3
4 8 1 3
5 7 2 6

Rõ ràng có 8! = 40.320 bảng như vậy . Bài toán đặt ra là :
Nếu xếp các ô cạnh nhau theo chiều mũi tên như trên hình vẽ sẽ được 1 số nguyên kiểu LongInt : 12345678 ( Hình 1 ) hoặc 41236785 ( Hình 2 ) hoặc 48136275 ( Hình 3 ).Giá trị của số này gọi là giá trị của bảng .
Hãy sắp xếp 40.320 bảng này theo thứ tự tăng nghĩa là sắp xếp 40.320 số kiểu LongInt .Không thể dùng mảng có kiểu Array[1.. 40320] of LongInt để lưu trữ các bảng này .
Vậy hướng giải quyết như thế nào ? Ta sẽ xây dựng 1 “Tự điển “ sắp xếp tăng các số này (nhưng không cần lưu trữ) .Mỗi số gọi là 1 từ trong tự điển .
Mỗi từ tạo thành như cách thức trên có những đặc trưng gì ? Nếu lần lượt tạo các chữ số từ trái qua phải , chữ số ở vị trí thứ i ( 0<= i <= 8 ) có k*(8-i)! số được tạo ra trước nó ; k là số các chữ số nhỏ hơn chữ số ở vị trí i mà chưa được dùng làm các chữ số trước i . Vậy từ ở vị trí thứ i là 1 cặp số ( i,k) ,trong tự điển nó đứng ở vị trí thứ :

8
VT =  ki * (8-i)! + 1 ( 1<=i<=8)
i=1
Thí dụ Bảng nêu ở hình 1 có VT = 1 vì ki =0 trong cả 8 số hạng .
Bảng nêu ở hình 2 có VT = 3*7! + 3! + 2! + 1! + 1 = 5049 …
Vậy chỉ cần các mảng sau :
+ Mảng M có 8 phần tử kiểu Word chứa 8 giá trị (8-i)! ( 1<= i 0) do
Begin
While D[j+1]=1 do Inc(j);
Inc(j);Dec(k);
End;
X[i] := j; D[j] := 1;
End;
End;
BEGIN
Clrscr;
For i:=1 to 8 do
Begin
Write(‘A[‘,i,’] = ‘);
Readln(A[i]);
End;
j := vitri(A);
Writeln(j);
Timso(j,A);
For i:=1 to 8 do Write(A[i]);
Readln
END.


VIII / Một số thao tác trên mảng


1 ) Duyệt mảng :
Mảng được duyệt nhờ sử dụng 1 biến điều khiển nhận giá trị từ chỉ số nhỏ nhất tới chỉ số lón nhất hoặc ngược lại . Một số loại bài tập duyệt mảng .
a ) Đếm số phần tử thoả mãn 1 tính chất nào đó ( thường dùng 1 biến đếm ) .
b ) Kiểm tra các phần tử của mảng xem đã được dùng vào một giai đoạn nào đó của bài toán chưa , phần tử nào đã được xem xét thì được đánh dấu bằng cách gán cho nó 1 giá trị đặc biệt .( Hoặc có thể dùng kèm theo 1 mảng phụ để đánh dấu ) .
c ) Thay đổi lại giá trị của 1 số phần tử có tính chất chung .
d ) Tìm một dãy con các phần tử liên tiếp nhau thoả mãn 1 tính chất nào đó .
e ) Xoá bỏ một số phần tử ( Thường dùng kèm theo 1 mảng đánh dấu ) .
g ) Duyệt mảng đồng thời dồn mảng sau khi xoá bỏ 1 số phần tử , hoặc chèn thêm vào 1 số phần tử .
h) Xử lý trên mảng vòng ( Hai phương pháp chính – Các bài tập 5,21,23.. sẽ đề cập )
2 ) Sắp xếp tăng , giảm :
Thường dùng một số phương pháp chính sau đây :
+ BubbleSort
+ ShellSort
+ QuickSort
+ HeapSort
+ Đổi chỗ trực tiếp
a ) Bubble Sort { Phương pháp nổi bọt }
Uses Crt;
Const N = 10000;
Type M1 = Array[1..N] of Integer;
Var A : M1;
i,j,x : Integer;
Begin
Clrscr;
Randomize;
For i:=1 to N do A[i] := Random(10);
For i:=1 to N do Write(A[i]:4);
For i:=2 to N do
For j:=N downto i do
If A[j-1] > A[j] then
Begin
x := A[j-1];
A[j-1] := A[j];
A[j] := x;
End;
Writeln;
For i:=1 to N do Write(A[i]:4);
Readln;
End.

b ) Shell Sort {Chèn trực tiếp với độ dài giảm dần , có biến đóng vai trò lính canh }
Uses Crt;
Const N = 10000;
Type M1 = Array[1..N] of Integer;
M2 = Array[1..4] of Integer;
Var A : M1;
H : M2;
i,j,m,k,s,x : Integer;
Begin
Clrscr;
Randomize;
For i:=1 to N do A[i] := Random(10);
For i:=1 to N do Write(A[i]:4);
H[1] := 1; H[2] := 3; H[3] := 5; H[4] := 9;
For m := 1 to 4 do
Begin
K := H[m];
S := -k;
For i:=K+1 to N do
Begin
x := A[i];
j := i-k;
If s=0 then s := -k;
Inc(s);
A[s] := x;
While x32000}
Type Chiso = 1..Max;
Mang = Array[Chiso] of Integer;
Var A : Mang;
Procedure Taomang; { Tạo ngẫu nhiên Mảng A(N) }
Procedure QuickSort;
Var s,D,C,i,j : Word;
coc,x : Integer;
dP,cP : Array[Chiso] of Chiso;
Begin
s:=1;
dP[s]:=1;
cP[s]:=Max;
Repeat
D:=dP[s]; { Chỉ số đầu của phân hoạch thứ s }
C:=cP[s]; { Chi số cuối của phân hoạch thứ s }
Dec(s);
Repeat
i:=D;
j:=C;
x:= A[(D+C) div 2];
Repeat
While A[i] < x do inc(i);
While x < A[j] do dec(j);
If ij;
If i=C;
Until s=0;
End;
Procedure Hien(X : Mang); { Hiện Mảng }
BEGIN
Repeat
Clrscr;
Taomang;
QuickSort;
Hien(A);
Write(‘ESC to Quit.Press any key to Continue…’);
Until ReadKey=#27;
END.
d) MergeSort { Đổi chỗ trực tiếp . Phương pháp này it dùng trên mảng vì tốn bộ nhớ}
e ) HeapSort { Phương pháp vun đống + Đệ qui sẽ học sau }

3 )Tạo mảng vòng :

Cách 1 : Biến i ( biến điều khiển ) duyệt mảng nhận các giá trị tăng dần ,đến khi i = N+1 thì gán i= 1 . Hoặc ngược lại biến i ( biến điều khiển ) duyệt mảng nhận các giá trị giảm dần ,đến khi i = 0 thì gán i = N .
Cách 2 : Nhân đôi mảng

i chạy từ 1 đến N để tạo các điểm
bắt đầu khác nhau của J

A(N) : 1 2 …….i ……….. ……………..N 1 2 3 ………..(i+N-1) ……………………2xN

J đi từ i tới i+N-1 là duyệt xong mảng A(N)

4 ) Biến định vị :

Trong khi duyệt mảng , người ta thường hay dùng 2 loại biến : Biến điều khiển vòng lặp để duyệt mảng và biến định vị để đánh dấu mốc những vị trí cần thiết ,nhằm mục đích tạo ranh giới phần đã duyệt và phần còn phải duyệt tiếp. Mỗi lần biến điều khiển “dò dẫm” duyệt mảng ,thấy điều kiện nào đó theo yêu cầu của đề bài được đáp ứng trên một dãy con nào đó của mảng thì biến điều khiển gửi ngay “thông điệp” cho biến định vị tới “quản lý” 2 vị trí chốt đầu và cuối dãy con này . Biến định vị lập tức nhận nhiệm vụ “lính canh” này và phấp phỏng chờ đợi “thông điệp mới của biến định vị “ để nhận chốt mới .

Thí dụ : Bài toán tìm dãy con dài nhất gồm các phần tử liên tiếp lớn hơn x :
( Xem lời giải chi tiết ở trang 122 )
+ Chương trình sẽ dùng 1 biến i làm nhiệm vụ duyệt mảng , 4 biến định vị : đ,c,Lđ,Lc
Biến đ : chốt điểm đầu của dãy con mới xây dựng
Biến c : chốt điểm cuối của dãy con mới xây dựng
Biến Lđ : chốt điểm đầu của dãy con dài nhất trước dãy con mới xây dựng
Biến Lc : chốt điểm cuối của dãy con dài nhất trước dãy con mới xây dựng
+ Khởi trị : Đ := 1;C := 1; LĐ := 1; LC:=1;
+ Biến i duyệt mảng bắt đầu từ 1 ,
* Nếu A[i] > x thì C chốt tới giá trị i này, i tiếp tục hành trình “thăm dò “ của mình , * Nếu A[i] LC-LĐ thì dãy con mới xây dựng dài hơn nên LC nhận giá trị mới là C , LĐ nhận giá trị mới là Đ . Đồng thời Đ và C lên giữ chốt mới là i, để bắt đầu xây dựng một dãy con khác
-Nếu C-Đ < = LC-LĐ thì chỉ xảy ra Đ và C lên giữ chốt mới là i, để bắt đầu xây dựng một dãy con khác

Bài tập Mảng 1 chiều

Bài 1: Nhập dãy A(N) gồm N số nguyên . Tìm giá trị nhỏ nhất m và giá trị lớn nhất M của dãy Hiện các số nguyên theo thứ tự tăng dần thuộc đoạn [m,M] mà các số nguyên này không thuộc dãy và là bội của 10 .

Bài 2: Có N người sắp thành hàng theo thứ tự để mua hàng . Thời gian người bán hàng phục vụ người thứ i là Ti ( i = 1,2,.., N ) .Nhập các số T1 , T2 …,Tn . Tìm thời gian mà người thứ i phải chờ để đến lượt mình mua hàng .

Bài 3: Nhập ngẫu nhiên Mảng A(N) gồm N số nguyên ( N nhập từ bàn phím ) . Lần lượt xoá các phần tử A[i] chia hết cho 3 ( i tăng dần ) sau đó dồn các số đứng ngay sau A[i] về phía đầu dãy 1 vị trí và giữ nguyên thứ tự của chúng . Hiện mảng sau khi đã dồn .

Bài 4: Nhập ngẫu nhiên Mảng A(N) gồm N số nguyên ( N nhập từ bàn phím ) . Lần lượt xoá các phần tử A[i] chia hết cho 3 ( i tăng dần ) sau đó chèn vào 3 số 0 ở vị trí i,i+1,i+2 . Hiện mảng sau khi đã dồn .

Bài 5: Cho N số nguyên dương từ 1 đến N , xếp thứ tự thành vòng tròn theo chiều quay kim đồng hồ ; cho p là số nguyên dương nhỏ hơn hoặc bằng N
a) Nhập N và P từ bàn phím
b) Từ vị trí thứ P , xoá số thứ P , sau đó bỏ qua 3 số rồi xoá số thứ tư theo chiều kim đồng hồ . Quá trình cứ tiếp diễn như thế cho đến khi còn lại 1 số . Hỏi số còn lại là số nào ?

Bài 6: Trộn 2 mảng đã xếp tăng thành mảng thứ 3 cũng xếp tăng

Bài 7: Câu a ) Trộn 2 mảng A(N) và B(M) vào mảng C sao cho C có các phần tử đôi một khác nhau và không đồng thời thuộc 2 mảng A và B .

Bài 8: Cho dãy bi gồm các bi mầu Xanh,Đỏ,Vàng . Lập trình với thuật toán sắp xếp mảng có biến định vị ( đóng vai trò lính canh giữ mốc ) hãy sắp xếp lại dãy sao cho các bi Xanh liên tiếp rồi đến các bi Đỏ , cuối cùng là các bi Vàng .

Bài 9: Cho dãy số nguyên dương A(N) nhập từ bàn phím gồm 3 loại số : Loại 1 : các số vừa chia hết cho 3 vừa lẻ lên , loại 3 : các số vừa chia hết cho 3 vừa chẵn , loại 2 : các số còn lại . Yêu cầu hãy xếp các số loại 1 lên đầu dãy , các số loại 3 xuống cuối dãy , các số loại 2 ở giữa dãy . Bằng cách tráo trị trực tiếp giữa 2 số và thuật toán “ chia để trị “ : trước hết xếp gọn hết các số loại 1 , sau đó xếp đồng thời các số loại 2 và 3 .. Đưa ra màn hình dãy ban đầu và dãy đã được sắp xếp .( Thuật toán này sẽ dùng ít phép đổi chỗ nhất )

Bài 10: Dãy đối gương là dãy các phần tử cách đều đầu dãy và cuối dãy thì bằng nhau . Nhập vào một dãy A(N) gồm N phần tử , mỗi phần tử là 1 kí tự . Hãy nối thêm vào dãy các phần tử n+1,n+2,…,m sao cho dãy A(M) gồm các phần tử từ 1 đến M là dãy đối gương và M càng nhỏ càng tốt .

Bài 11: Nhập từ bàn phím số nguyên dương N và giá trị các phần tử của mảng A(N) là số thực . Tìm dãy dài nhất gồm các phần tử liên tiếp của mảng lớn hơn số thực x ( nhập từ bàn phím ) .
Bài 12: Nhập từ bàn phím số nguyên dương N và giá trị các phần tử của mảng A(N) là số thực . Tìm dãy tăng dài nhất gồm các phần tử liên tiếp của mảng này .

Bài 13: Một dãy được gọi là đối xứng gương nếu các phần tử cách đều đầu và cuối thì bằng nhau . Cho dãy số A(N) . Hãy tìm một dãy con các phần tử liên tiếp nhau của dãy A(N) tạo thành một dãy đối xứng gương dài nhất .

Bài 14: Chia dãy số tự nhiên thành nhiều đoạn nhất có tổng bằng nhau .

Bài 15: Cho dãy số nguyên (mỗi số không quá 15 chữ số ) .Trong dãy trên , xây dựng các dãy con gồm các số đứng liền nhau ( bản thân dãy cũng là 1 dãy con của nó ) Hiện dãy con có tổng các phần tử lớn nhất

Bài 16 : Phân tích số nguyên dương thành tổng các số hạng của dãy Fibonaxi sao cho ít số hạng nhất .

Bài 17 : Nhập số nguyên dương N . Tìm bộ số nguyên không âm ( D0 , D1 , …., Dm ) với Di <= i để phân tích N thành dạng tổng :
N = D0 + D1 * 2! +…+ Dm * (m+1)! Chú thích : (M+1)! = 1.2.3…(M).(M+1)

Bài 18 : Tìm 1000 phần tử đầu tiên theo thứ tự tăng dần mà mỗi phần tử có dạng là tích các luỹ thừa của 2,3,5 với số mũ là số tự nhiên .

Bài 19: Có N công ty (N<=300) cho nhau vay tiền . Lập kế hoạch giúp Hội đồng chứng khoán thông báo cho các công ty trả tiền cho nhau sao cho số lượng tiền thông báo các công ty trả cho nhau là ít nhất ( Nghĩa là tìm các chỗ xoá nợ hợp lý giữa các công ty với nhau ) . Thí dụ A nợ B 2000, B nợ C 1000 , C nợ A 1500 thì thông báo A và C đều trả B 500 . ( Cho tối đa 3.000 quan hệ nợ – có giữa các công ty )

Bài 20: Giả sử P =(p1,p2…,pn) là một hoán vị của (1,2,…,n). Bảng nghịch thế của hoán vị P là T=(t1,t2,..tn) , trong đó ti bằng số các phần tử của P đứng bên trái i và lớn hơn i
Ví dụ : P=(5,9,1,8,2,6,4,7,3) thì có T=(2,3,6,4,0,2,2,1,0)
Viết chương trình nhập bảng nghịch thế T , tìm và hiện hoán vị tương ứng P

Bài 21:Cho một chuỗi N hạt (N<=100) . Trong chuỗi có một số hạt màu đỏ , một số hạt màu xanh , những hạt còn lại màu trắng . Các hạt trong chuỗi được xếp ngẫu nhiên . Giả sử ta có 2 chuỗi hạt sau khi cắt đứt tại 1 vị trí và kéo thẳng như sau :
Chuỗi 1 : brbrrrbbbrrrrrbrrbbrbbbbrrrrb
Chuỗi 2 : bbwbrrrwbrbrrrrrb
r : Đỏ , b : Xanh, w : Trắng .
Giả sử bạn có chuỗi hạt chưa bị cắt và bây giờ có thể cắt chuỗi hạt , trải thẳng ra và sau đó chọn các hạt cùng màu hạt đầu tiên từ từng đầu bị cắt cho đến khi gặp hạt khác màu .Hãy xác định điểm cắt để số lượng hạt được chọn là lớn nhất trong 2 trường hợp
+ Chuỗi hạt không có hạt trắng như chuỗi 1 Đáp số : Dài 8 , giữa 9 và 10
+ Chuỗi hạt có hạt trắng và thêm điều kiện là : nếu gặp hạt trắng thì coi nó là màu xanh hoặc màu đỏ đều được (tuỳ chọn ) . Đáp số : Dài 10 , giữa 16 và 17
Bài 22 : Cho phân số M/N ( 0<MptM then ptM := A[i];
PtMax := PtM;
End;
Function PtMin : Integer;
Var i,PtM : Integer;
Begin
PtM := MaxInt;
For i:=1 to N do
If A[i]<ptM then ptM := A[i];
PtMin := PtM;
End;
Procedure XuLy;
Var i,j : Integer;
Begin
M2 := PtMax;
M1 := PtMin;
j := 0;
For i:=M1 to M2 do
If (i mod 10 = 0) then
Begin
Inc(j);
B[j] := i;
End;
dem := j;
For i:=1 to dem do C[i] := True;
For j:=1 to dem do
For i:=1 to N do
If B[j] = A[i] then
Begin
C[j] := False;
i := N;
End;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do
Write(A[i]:4);
Writeln;
For i:=1 to dem do
If C[i] then Write(B[i]:4);
Writeln;
End;
BEGIN
Clrscr;
Nhap;
Xuly;
Hien;
Readln;
END.

Bài 2:
Uses Crt;
Const Max = 10;
Type Mang = Array[1..Max] of Integer;
Var T : Mang;
N,i : Integer;
Procedure Nhap;
Var i: Integer;
Begin
Clrscr;
Write(‘Nhap so luong nguoi mua hang la N = ‘);
Readln(N);
Writeln(‘Nhap thoi gian ban hang cho tung nguoi ‘);
For i:=1 to N do
Begin
Write(‘T[‘,i,’] = ‘);
Readln(T[i]);
End;
End;
Function Tinh(i : Integer): Integer;
Var j,gt : Integer;
Begin
Gt := 0;
For j:=1 to i do gt := gt + T[j];
Tinh := gt;
End;
Procedure Xuly;
Var i : Integer;
Begin
Writeln(‘Thoi gian cho mua hang cua nguoi thu 1 : 0 ‘);
For i:=2 to N do
Begin
Write(‘Thoi gian cho mua hang cua nguoi thu ‘,i,’ : ‘);
Writeln(Tinh(i-1));
End;
End;
BEGIN
Nhap;
Xuly;
Readln
END.

Bài 3:
Uses Crt;
Const Max = 1000;
Type Mang = Array[1..Max] of Integer;
Var A : Mang;
N,i,L: Integer;
Procedure Nhap;
Var i: Integer;
Begin
Clrscr;
Write(‘Nhap so phan tu cua mang A = ‘);
Readln(N);
Randomize;
For i:=1 to N do A[i] := Random(10);
End;
Procedure Hien(k : Integer);
Var i : Integer;
Begin
For i:=1 to k do Write(A[i]:2);
Writeln;
End;
Procedure Xuly;
Var i,j : Integer;
Begin
L := N;
i:=1;
While i<=L do
If A[i] mod 3 = 0 then
Begin
For j:=i to L-1 do A[j] := A[j+1];
Dec(L);
End
Else Inc(i);
End;
BEGIN
Nhap;Hien(N);
Xuly;Hien(L);
Readln
END.

Bài 4:
Uses Crt;
Const Max = 1000;
Type Mang = Array[1..Max] of Integer;
Var A : Mang;
N,i,L: Integer;
Procedure Nhap;
Var i: Integer;
Begin
Clrscr;
Write(‘Nhap so phan tu cua mang A = ‘);
Readln(N);
Randomize;
For i:=1 to N do A[i] := Random(10);
End;
Procedure Hien(k : Integer);
Var i : Integer;
Begin
For i:=1 to k do Write(A[i]:2);
Writeln;
End;
Procedure Xuly;
Var i,j : Integer;
Begin
L := N;
i:=1;
While i1 do
Begin
Inc(i);
If i=N+1 then i := 1; { Kỹ thuật xử lý mảng vòng }
If not xoa[i] then
Begin
Inc(dem);
If dem mod 4 = 0 then
Begin
Xoa[i] := True;
Write(A[i]:2);
Dec(con);
End;
End;
End
End;
Procedure Hien2;
Var i : Integer;
Begin
For i:=1 to N do
If not xoa[i] then Write(A[i]);
End;
BEGIN
Nhap;Hien(N);
Xuly;Hien2;
Readln
END.

Bài 6:
Uses Crt;
Const Max = 100;
Type k1 = Array[1..Max] of integer;
k2 = Array[1..2*Max] of integer;
Var A,B : k1;
C : k2;
m,n,i,j : Byte;
Procedure Nhap(Ch : Char;Var spt:byte);
Begin
Repeat
Write(‘ Nhap so phan tu cua mang ‘,Ch,’ : ‘);
{$I-} Readln(spt);{$I+}
Until (IoResult=0) and (spt>0) and (sptX[j] then
Begin
coc:=X[i];
X[i]:=X[j];
X[j]:=coc;
End;
End;
Procedure Tron;
Var i,j,k:byte;
Begin
i:=1;j:=1;k:=1;
While (i<=m) and (j<=n) do
Begin
If A[i]m then
While jn then
While i0) and (sptX[j] then
Begin
coc:=X[i];
X[i]:=X[j];
X[j]:=coc;
End;
End;
Procedure Hien(X : K1;spt : Integer);
Var i : Integer;
Begin
For i:=1 to Spt do Write(X[i]:4);
Writeln;
End;
Procedure Lam;
Var i,j,k : Integer; Ok : Boolean;
Begin
i := 1;
j := 1;
k := 0;
While (i<=M) and (j<=N) do
Begin
While A[i]=A[i+1] do Inc(i);
While B[j]=B[j+1] do Inc(j);
If (A[i]<B[j]) and(i<=M) and (j<=N) then
Begin
Inc(k);
C[k] := A[i];
Inc(i);
End;
If (A[i]=B[j]) and(i<=M) and (jB[j]) and(i<=M) and (jM then
While jN then
While i0) and (N<Max);
Randomize;
For i:=1 to N do
Begin
j := Random(3)+1;
Case j of
1 : ch := ‘X’;
2 : Ch := ‘D’;
3 : ch := ‘V’;
End;
A[i] := ch;
End;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do
Begin
Case A[i] of
‘X’ : Textcolor(10);
‘D’ : Textcolor(12);
‘V’ : Textcolor(14);
End;
Write(A[i]:2);
End;
Textcolor(15);
End;
Procedure Lam;
Var D,C : word; { 2 biến định vị }
i,j : word; { 2 biến duyệt mảng }
Begin
D := 0; C := N+1;
i := 1; j := N; dem := 0;
While (i i) do Dec(j);
If j=i then Exit;
If A[j]=’V’ then
Begin
A[j] := A[i];
A[C-1]:=’V’;
Dec(C);
Inc(dem);
Hien;
End
Else
Begin
A[j] := A[i];
A[i]:=’X’;
Inc(D);
Inc(dem);
Hien;
End;
End;
End;
End;
BEGIN
Clrscr;
Nhap;
Hien;Writeln;
Lam; Writeln;
Writeln(‘So phep bien doi la : ‘,dem );
Readln
END.

Bài 9:
Uses Crt;
Const Max = 1000;
Type Mang = Array[1..Max+1] of Integer;
Var A,B : Mang;
T1,T3,N : Integer;
Procedure Nhap;
Var i: Integer;
Begin
Write(‘Nhap so phan tu cua mang ( la N <=1000 ) N = ‘);
Readln(N);
Randomize;
T1 := 0;
T3 := 0;
For i:=1 to N do
Begin
B[i] := 2;
A[i] := Random(100);
If (A[i] mod 3 = 0) then
If (A[i] mod 2 = 1) then
Begin Inc(T1);B[i] := 1; End
Else Begin Inc(T3);B[i] := 3; End;
End;
End;
Function Tim1_B2 : Integer;
Var i : Integer;
Begin
For i:= T1+1 to N-T3 do
If (B[i]=1) then
Begin
Tim1_B2 := i;
Exit;
End;
Tim1_B2 := 0;
End;
Function Tim1_B3 : Integer;
Var i : Integer;
Begin
Tim1_B3 := 0;
For i:= N-T3+1 to N do
If (B[i]=1) then
Begin
Tim1_B3 := i;
Exit;
End;

End;
Function Tim2_B3 : Integer;
Var i : Integer;
Begin
Tim2_B3 := 0;
For i:= N-T3+1 to N do
If B[i]=2 then
Begin
Tim2_B3 := i;
Exit;
End;
End;
Procedure Trao(Var X : Mang;a,b : Integer);
Var phu : Integer;
Begin
phu := X[a];
X[a]:= X[b];
X[b]:= phu;
End;
Procedure XepB1;
Var i,j,k: Integer;
Begin
i := 1;
While i0 then
Begin
Trao(A,i,j);
Trao(B,i,j);
Inc(i);
End
Else {j=0}
Begin
Trao(A,i,k);
Trao(B,i,k);
Inc(i);
End
Else
If (B[i]=3) then
If k>0 then
Begin
Trao(A,i,k);
Trao(B,i,k);
Inc(i);
End
Else
Begin
Trao(A,i,j);
Trao(B,i,j);
Inc(i);
End
End;
End;
End;
Procedure XepB2_3;
Var i,j : Integer;
Begin
i:=T1+1 ;
While i0 then
Begin
Trao(A,i,j);
Trao(B,i,j);
Inc(i);
End;
End;
End;
End;
Procedure Xuly;
Begin
XepB1;
If Tim2_B3>0 then XepB2_3;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do
Begin
If B[i]=1 then Textcolor(15)
Else If B[i]=2 then Textcolor(12)
Else Textcolor(14);
Write(A[i]:4);
Textcolor(15);
End;
Writeln;
End;
BEGIN
Clrscr;
Nhap;
Hien;Writeln;
Xuly;Writeln;
Hien;
Writeln(T1:3, ‘ Mau Trang : Chia het cho 3 va le ‘);
Writeln(N-T3-T1:3,’ Mau Do : Con lai : chia cho 6 du 2,-2 ‘);
Writeln(T3:3, ‘ Mau Vang : Chia het cho 3 va chan ‘);
Readln
END.

Bài 10:
Program Daydoiguong;
Uses Crt;
Const Max = 100;
Var A : Array[1..2*Max] of Integer;
N,i : Integer;
Procedure Nhaptay;
Var i : Integer;
Begin
Repeat
Write(‘Nhap N = ‘);
{$I-} Readln(N); {$I+}
Until (IoResult=0) and (N>0) and (N<=Max);
For i:=1 to N do
Begin
Write(‘A[‘,i,’] = ‘);
Readln(A[i]);
End;
End;
Procedure Hien(d : Integer);
Var i : Integer;
Begin
For i:=1 to d do Write(A[i]:2);
Writeln;
End;
Function Doiguong(d,c : Integer):Boolean;
Var j : Integer;
Begin
For j:=1 to ((c-d) div 2 +1) do
If A[d+j-1]A[c-j+1] then
Begin
Doiguong := False;
Exit;
End;
Doiguong := True;
End;
Procedure Tim1;
Var j : Integer;
Begin
If Doiguong(1,N) then
Begin
Writeln(‘Khong can them so hang nao ‘);
Readln;
Halt;
End;
Repeat
Inc(i);
A[i] := A[1];
For j := i-1 downto (N+1) do A[j] := A[i-j+1];
Until doiguong(1,i) or (i=2*N+1);
End;
Procedure Tim2;
Var k,j : Integer;
Begin
k := 1;
While (not doiguong(k,N)) and (k0) and (N<=Max);
For i:=1 to N do
Begin
Write(‘A[‘,i,’] = ‘);
Readln(A[i]);
End;
Write(‘Nhap x =’); Readln(x);
End;
Procedure Work;
Var d,c,i,j : Word;
Begin
d := 0;
c := 0;
i := 0;
Repeat
Inc(i);
While (A[i]<=x) and (in then Break;
j := i;
While (A[i]>x) and (ic-d then
Begin
d:=j;
c:=i-1;
End;
Until i>n;
If ( c = 0 ) and ( d=0 ) then Writeln(‘Khong co so nao lon hon ‘,x )
Else Write(‘Day max tu ‘,d,’ den ‘,c);
End;
Procedure Hien;
Var i: Integer;
Begin
For i:=1 to N do Write(A[i]:2);
Writeln;
End;
BEGIN
ClrScr;
Nhap;
Hien;
Work;
Readln
END.

Bài 12:
Uses Crt;
Const
Max = 1000;
Type Ma = Array[1..Max+1] of Word;
Var A : Ma;
n : Word;
x : Word;
Procedure Nhap;
Var i : Integer;
Begin
ClrScr;
Write(‘Nhap so phan tu cua day la N = ‘); Readln(N);
Randomize;
For i:=1 to N do
A[i] := Random(100);
End;
Procedure Work;
Var d,c,i,j : Word;
Begin
d:=0;
c:=0;
i:=0;
Repeat
Inc(i);
While (A[i]>A[i+1]) and (in then Break;
j:=i;
While (A[i]<A[i+1]) and (i c-d then
Begin
d:=j;
c:=i;
End;
Until i>n;
If (c = 0) and (d=0) then Writeln(‘Day tang 1 phan tu ‘,A[1] )
Else Write(‘Day max tu ‘,d,’ den ‘,c);
End;
Procedure Hien;
Var i: Integer;
Begin
For i:=1 to N do Write(A[i]:4);
Writeln;
End;
BEGIN
ClrScr;
Nhap;
Hien;
Work;
Readln
END.

Bài 13 :
Uses Crt;
Const Max = 100;
Var A : Array[1..Max] of Integer;
N : Integer;
Procedure NHAP;
Var i : Integer;
Begin
Write(‘Nhap N = ‘);
Readln(N);
For i:=1 to N do
Begin
Write(‘A[‘,i,’] = ‘);
Readln(A[i]);
End;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do Write(A[i]:5);
Writeln;
End;
Function Doiguong(d,c : Integer):Boolean;
Var i : Integer;
Begin
For i:=1 to ((c-d) div 2 + 1) do
If A[d+i-1]A[c-i+1] then
Begin
Doiguong := False;
Exit;
End;
Doiguong := True;
End;
Procedure Tim;
Var d,c,i,j : Word;
Begin
d:=1;
c:=1;
For i:=1 to N-1 do
For j:=i+1 to N do
Begin
If doiguong(i,j) then
If (j-i) > (c-d) then
Begin
d := i;
c := j;
End;
End;
Write(‘Day max tu ‘,d,’ den ‘,c);
End;
BEGIN
Clrscr;
Nhap;
Hien;
Tim;
Readln
END.
Bài 14:
Uses Crt;
Const Mn = 100;
Type M1 = Array[1..Mn] of Word;
Var A : M1;
n,i,j : Integer;
Function Min(a,b : Word) : Word;
Begin
If a>b then Min := b
Else Min := a;
End;
Procedure Sinh(T,k: Word);
Var s : Word;
Begin
If N mod k 0 then
Begin
Writeln(‘Khong the chia day ‘,n,’ phan tu thanh ‘,k,’ doan ‘);
Readln;
Halt;
End;
Randomize;
i:=1;
While i<=N do
Begin

s := T;
For j:=i to i+k-1 do
Begin
A[j] := Random(s);
s := s-A[j];
End;
If s0 then A[j] := A[j]+s;
Inc(i,k);
End;
End;
Procedure Hien;
Var i : Word;
Begin
For i:=1 to n do Write(A[i]:4);
End;
Function Chia(k : Word): Boolean;
Var i,j,p,luup : Word;
Begin
Chia := False;
If N mod k0 then Exit;
p := 0;
For j := 1 to k do p := p+A[j];
Luup := p;
i :=k+1;
While i<=N do
Begin
p := 0;
For j := i to i+k-1 do p := p+A[j];
If pLuup then Exit;
Inc(i,k);
End;
Chia := True;
End;
Procedure Test;
Var i,j : Word;
Begin
Writeln;
For i:=1 to N do
If chia(i) then
Begin
Writeln(‘Do dai ngan nhat cua doan chia la : ‘,i);
Exit;
End;
End;
BEGIN
Clrscr; N:=60;
Sinh(30,3);{Tạo dãy có tổng = 30, chia được nếu N chia hết cho 3 , mỗi đoạn 3 pt}
Hien; Test;
END.

Bài 15:
Uses Crt;
Const Max = 100;
Type Mang = Array[0..Max] of Real;
Var A : Mang;
N : Integer;
Procedure NhapNgaunhien;
Var i,tu,mau : Integer;
Begin
Write(‘Nhap so phan tu cua mang : ‘);Readln(N);
Randomize;
For i:=1 to N do
Begin
Tu := Random(100); Mau := Random(200)+1; A[i] := tu/mau-1;
End;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do Write(A[i]:8:1);
End;
Procedure Tim;
Var i,j,d,c : Integer;{ i biến duyệt mảng , vai trò lính dò dẫm tìm vị trí cho j và c }
LuuT,Tong : Real; { d, j và c là các biến định vị làm nhiệm vụ giữ chốt }
Begin
d:=1; c:=1;
Tong := A[1];
LuuT := Tong;
For i:=2 to N do
Begin
If Tong>0 then Tong := Tong+A[i]
Else Begin Tong := A[i]; j := i; End;
If Tong>LuuT then
Begin c := i; d:= j; LuuT := Tong; End;
End;
Writeln;
Writeln( ‘( ‘ ,d, ‘ , ‘ , c , ‘ ) —> ‘,LuuT:8:1);
End;
BEGIN
Clrscr;
NhapNgaunhien;
Hien;
Tim;
Readln
END.
Sau đây là bài giải thamkhảo ( lập trình trên kiểu File )
Uses Crt;
Const Max = 1000;
Fi = ‘bai15.txt’;
Var N : LongInt;
Procedure Tim;
Var i,j,d,c : LongInt;
LuuT,Tong,p : Extended;
F : Text;
Begin
Assign(F,Fi); Reset(F);
Readln(F,N);
Read(F,p);Writeln(p:15:0);
Tong := p;
LuuT := Tong;
d:=1; c:=1;
For i:=2 to N do
Begin
Read(F,p); Writeln(p:15:0);
If Tong>0 then Tong := Tong+p
Else Begin Tong := p; j:= i; End;
If Tong>LuuT then
Begin LuuT := Tong;d:=j; c := i;End;
End;
Close(F);
Writeln; Writeln(‘(‘,d,’,’,c,’) —> ‘,LuuT:18:0);
End;
Procedure Test;
Var F : Text; i : Longint; p : Extended;
Begin
Assign(F,Fi); Rewrite(F);
Writeln(F,MAX);
Randomize;
For i:=1 to max do
Begin
p := Random(10000); p := (p-Random(10000))*1.1234567891234567E11;
Writeln(F,p);
End;
Close(F);
End;
BEGIN
Clrscr; Test;
Tim; Readln
END.

Bài 16:
{$N+}{$E+}
Uses crt;
Const Max = 500;
Type Ta = Array[1..max] of Extended;
Var N,LN : Extended;
A,D : Ta;
M,p : Integer;
Procedure NhapN;
Begin
Repeat
Clrscr;
Write(‘Cho biet so nguyen duong N:=’);
{$i-} Readln(N); {$i+}
Until (ioresult=0) and (Int(N)= N);
LN := N;
End;
Procedure Bang_GT;
Var i: Integer;
Begin
A[1] := 1;
A[2] := 1;
M := 2;
While (A[M]0) do
Begin
While (A[m]>N) do Dec(m);
N:=N-A[m];
Inc(p);
D[p]:= A[m];
End;
End;
Procedure Thuchien;
Var i: Integer;
Begin
p := 0;
XaydungD;
Writeln(‘Phan tich ‘,LN:40:0,’ =’);
For i:=1 to p do
If i<p then Write(D[i]:12:0,’ +’) Else Write(D[i]:15:0);
Writeln;
End;
BEGIN
Repeat
NhapN;
Bang_GT;
Thuchien;
Write(‘ESC to quit or press any key to continue . . . ‘);
Until (Readkey=#27);
END.

Bài 17 :
Uses crt;
Const Max = 50;
Type Ta = Array[1..max] of Real;
Td = Array[1..max] of Byte;
Var N : Extended;
D : Td;
A : Ta;
M : Byte;
Procedure NhapN;
Begin
Repeat
Clrscr;
Write(‘Cho biet so nguyen duong khac 0 N:=’);
{$i-} Readln(n); {$i+}
Until (ioresult=0) and (int(n)=n);
End;
Function Gt(m:Byte):real;
Var phu : Real;
i : Byte;
Begin
Phu := 1;
For i:=1 to m do Phu:=Phu*i;
GT := phu;
End;
Procedure Bang_GT(N:Real);
Begin
A[1] := 1;
M := 1;
While (A[m]0) do
Begin
While (A[m]>n) do Dec(m);
If (D[m]0) then
Writeln(‘D[‘,i:2,’]=’,D[i]:2,’*’,A[i]:10:0,’ = ‘,D[i]*A[i]:10:0);
End;
BEGIN
Repeat
NhapN;
Bang_GT(n);
Thuchien;
Write(‘ESC to quit or press any key to continue . . . ‘);
Until (Readkey=#27);
END.
Bài 18:
Uses Crt;
Const Max = 30;
Type Chiso = 1..Max;
M = Array[Chiso] of Real;
Var x,x2,x3,x5 : Real;
i,i2,i3,i5 : Word;
A : M;
Procedure Khoitri;
Begin
i := 1; i2 := 1; i3 := 1; i5 := 1;
A[1] := 1; x2 := 2; x3 := 3; x5 := 5;
End;
Procedure Duyet;
Begin
For i:=2 to Max do
Begin
While x2<= A[i-1] do
Begin
Inc(i2);
x2 := 2*A[i2];
End;
While x3<= A[i-1] do
Begin
Inc(i3);
x3 := 3*A[i3];
End;
While x5<= A[i-1] do
Begin
Inc(i5);
x5 := 5*A[i5];
End;
If x2<x3 then x:=x2 Else x:=x3;
If x50 then
For j:=1 to N do
If D[j]0 then
Begin
Writeln(j:4,’ –> ‘,i:4,-D[j]:8:0);
D[i] := D[i]+D[j];
D[j] := 0;
End
Else
If D[i]>0 then
Begin
Writeln(j:4,’ –> ‘,i:4,D[i]:8:0);
D[j] := D[i]+D[j];
D[i] := 0;
End;
End;
BEGIN
Clrscr;
Nhap;
Lam;
Writeln(‘Xong’);
END.

Bài 20:
Uses Crt;
Const NN = 5000;
Type Mang = Array[1..NN] of Integer;
Var N,i,j,k : Integer;
P,T : Mang;
Procedure Phucvu_Test;
Var i,p : Integer;
H : Mang;
Ok : Boolean;
d : Array[1..NN] of Boolean;
Begin
Randomize;
Fillchar(d,sizeof(d),False);
For i:=1 to NN do
Begin
Repeat
Ok := False;
p := Random(nn)+1;
If not d[p] then
Begin
H[i] := p;
D[p] := True;
Ok := True;
End;
Until Ok;
End;
Fillchar(T,Sizeof(T),0);
For i:=1 to NN do
Begin
j:=1;
While H[j]i do inc(j);
For k:=1 to j-1 do
If H[k]>i then Inc(T[i]);
End;
For i:=1 to NN do Write(T[i]:4);
Writeln;
For i:=1 to NN do Write(H[i]:4);
End;
Procedure NhapP;
Var i : Integer;
Begin
For i:=1 to NN do
Begin
Write(‘T[‘,i,’] = ‘);
Readln(T[i]);
End;
End;
Procedure Tim;
Var i,j,k : Integer;
F : Text;
Begin
FillChar(P,Sizeof(P),0);
For i:=1 to NN do {Chú ý các giá trị của mảng P với các giá trị là i tăng dần }
Begin
j := 0;
k := 0;
Repeat {Tìm vị trí k trong P để ghi số i }
Inc(k);
If P[k]=0 then Inc(j);
Until j>T[i];
P[k] := i;
End;
Writeln(‘Hoán vị cần tìm là : ‘);
For i:=1 to NN do Write(P[i]:4);
Writeln;
Writeln(‘Xong’);
End;
BEGIN
Clrscr;
{Phucvu_Test;}
NhapT;
Tim;
Readln;
END.

Bài 21 :
Uses Crt; { Kỹ thuật xử lý mạch vòng }
Const s = 100;
Type Mang = Array[1.. 2*s] of Char;
Var N,cat : Integer;
C : mang;
Procedure Tao;
Var i,p : Integer;
F : Text;
Begin
Assign(F,’Hatngoc.txt’);
Rewrite(F);
Writeln(F,s);
Randomize;
For i:=1 to s do
Begin
p := Random(3)+1;
Case p of

1: C[i] := ‘B’;
2: C[i] := ‘R’;
3: C[i] := ‘W’;
End;
Writeln(F,C[i]);
C[i+s] := C[i];
End;
Close(F);
End;
Procedure Nhap;
Var i : Integer;
F : Text;
Begin
Assign(F,’Hatngoc.txt’);
Reset(F);
Readln(F,N);
For i:=1 to N do
Begin
Readln(F,C[i]); { Nhân đôi mảng }
C[i+N] := C[i];
End;
Close(F);
End;
Procedure Nhaptay;
Var i : Integer;
Begin
Write(‘Nhap so hat ngoc : ‘);
Readln(N);
For i:=1 to N do
Begin
Write(‘C[‘,i,’] = ‘);
Readln(C[i]);
C[i+N] := C[i];
End;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do Write(C[i]:2);Writeln;
For i:=N+1 to 2*N do Write(C[i]:2);
End;
Procedure Tim;
Var i,j,d,ld,p,t : Integer;
Function DemPhai(vt : Integer): Integer;
Var j,d,p,dau : Integer;
Begin
j := vt; {Dem tu vt=i+1 }
d := 0;
dau := j;
If (C[j]=’W’) and (j=dau) then
Begin
While (C[j]=’W’) and (j<vt+N) do
Begin
Inc(d);
Inc(j);
End;
dau :=j;
End;
While ((C[j]=C[dau]) or (C[j]=’W’)) and (jvt-N) do
Begin
Inc(d);
Dec(j);
End;
dau :=j;
End;
While ((C[j]=C[dau]) or (C[j]=’W’)) and (j>vt-N) do
Begin
Inc(d);
Dec(j);
End;
DemTrai := d;
End;
Begin
Ld := 1;
For i:=1 to N do
Begin
p := i+1;
d := demPhai(p)+demTrai(i+N);
If d > Ld then
Begin
Ld := d;
cat:= i;
End;
End;
Writeln;
Writeln(‘Cho cat giua ‘,cat ,’ va ‘, (cat mod N)+1,’ dai la : ‘, Ld);
End;
BEGIN
Clrscr; {Tao;} {Nhap;}
NhapTay;
Hien;
Tim;
Readln
END.

Bài 22 : { Sau này sẽ giải bằng phương pháp đệ qui để tìm cách phân tích tốt nhất }
Uses Crt;
Const Max = 21212121;
Var m,n : LongInt;
Sol : Word;
Procedure Nhap;
Begin
Repeat
ClrScr; Write(‘Nhap m,n = ‘);
{$I-} Readln(m,n); {$I+}
Until (Ioresult=0) and (m>0) and (n>0) and (m<n) and (n0 do
Begin
If (n mod i=0) and (m*i>=n) then
Begin
m:=m-n div i;
Write(‘1/’,i);
Inc(Sol);
If m>0 then Write(‘+ ‘);
If m=0 then Exit;
End
Else i:=i+1;
End;
End;
BEGIN
Repeat
Nhap; Phantich;
Until ReadKey=#27;
END.

Bài kiểm tra về mảng 1 chiều

Bài 23 : Cho N cây xăng A1 , A2 ….., An xây dựng trên 1 đường đua ô tô quốc tế là vòng tròn dài hàng nghìn Km . Sức chứa của các cây xăng này bắt đầu từ cây xăng A1 theo chiều kim đồng hồ lần lượt là X1 , X2 , … … , Xn . Lượng xăng chi phí cho 1 ô tô đi từ A1 tới A2 là C1 , từ A2 tới A3 là C2 , …, An-1 tới An là Cn-1 , từ An tới A1 là Cn
Giả sử một ô tô đến mỗi cây xăng , nó có thể lấy hết số xăng có ở các cây xăng này Hãy lập trình giúp Ban tổ chức đặt điểm xuất phát cho ô tô tại cây xăng nào để ô tô chạy theo chiều kim đồng hồ và về được nơi xuất phát .

Uses Crt;
Const Max = 10;
Type M1 = Array[1..Max] of Integer;
M2 = Array[1..2*Max] of Integer;
Var X,C : M1;
N,i : Integer;
Procedure NhapNGNH;
Var i : Integer;
Begin
Write(‘So luong cac cay xang la : ‘); Readln(N);
Randomize;
For i:=1 to N do X[i] := Random(20)+1; For i:=1 to N do C[i] := Random(20)+1;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do Write(X[i]:4); Writeln;
For i:=1 to N do Write(C[i]:4); Writeln;
End;
Function Tim(j : Integer): Boolean; { Kỹ thuật xử lý mạch vòng bằng nhân đôi mảng }
Var TX,TC : M2; i : Integer;
Begin
For i:=1 to N do TX[i]:=X[i]; For i:=1 to N do TX[i+N]:=X[i];
For i:=1 to N do TC[i]:=C[i]; For i:=1 to N do TC[i+N]:=C[i];
TX[j] := X[j];
For i:= j+1 to j+N-1 do TX[i] := TX[i]+TX[i-1];
For i:= j+1 to j+N-1 do TC[i] := TC[i]+TC[i-1];
For i:=j to j+N-1 do
If TX[i]-TC[i]33000 ) . Hiện giá trị F(N) – Vô địch Maxcơva 1991 –
{ Gợi ý : Dùng phương pháp chia đôi }

Bài 26: Tìm dãy con các phần tử liên tiếp đơn điệu , có độ dài lớn nhất .

Bài 27: ( Đề thi chọn học sinh giỏi khối 10 Hà Tây 4/1997 hệ PTTH chuyên ban ) : Nhập từ bàn phím số nguyên dương N .
a) Khi N10 , nhập ngẫu nhiên các phần tử của mảng .
Hiện vị trí i và j là vị trí đầu và cuối của dãy con các phần tử liên tiếp của mảng sao cho dãy này là dãy đối gương .

Lời giải bài 27
Uses Crt;
Const Max =10000;
Var A : Array[1..Max] of LongInt;
N,d : Integer;
T : LongInt Absolute $0:$046C;
LT : LongInt;
Procedure Nhap;
Var i: Integer;
Begin
Write(‘Nhập số phần tử của mảng N = ‘);
Repeat
{$I-} Readln(N); {$I+}
Until (IoResult=0) and (N>0) and (N<=Max);
Randomize;
If N10 then
For i:=1 to N do A[i] := Random(10);
End;
Function DG(i,j : Integer): Boolean;
Var k : Integer;
Begin
k := 0;
While (A[i+k]=A[j-k]) and (i+k=j-k then DG:= True Else DG:= False;
End;
Procedure Hien;
Var i : Integer;
Begin
For i:=1 to N do Write(A[i]:2);
Writeln;
End;
Procedure Xuly;
Var i,j,Ld,d,Li,Lj : Integer; Tiep : Boolean;
Begin
Ld:=0;Li:=1;Lj:=1;
For i:=1 to N-Ld do
For j:=i+Ld-1 to N do
Begin
If DG(i,j) then
Begin
Ld := j-i +1;
Li := i;
Lj := j;
End;
End;
Write(‘Doan doi guong dai nhat tu ‘,Li,’ den ‘,Lj,’ : ‘);
For i:=Li to Lj do Write(A[i]:2);
End;

BEGIN
Clrscr;
{ Nhap; }
{TaoF; }
NhapF;
Hien;
d := 0;
Lt := T;
Xuly;
Writeln(#13#10,’Mat thoi gian la : ‘,((T-Lt)/18.2):10:0);
Readln
END.

Có thể tạo File và sau đó nhập từ File bằng các thủ tục sau :
Procedure TaoF;
Const TF = ‘doiguong.txt’;
Var F : Text; i : Integer;
Begin
Assign(F,TF);
ReWrite(F);
Write(‘Nhap so phan tu : ‘);
Readln(N);
Writeln(F,N);
For i:=1 to N do Writeln(F,Random(2):4);
Close(F);
End;

Procedure NhapF;
Const TF = ‘doiguong.txt’;
Var F : Text; i: Integer;
Begin
Assign(F,TF);
Reset(F);
Readln(F,N);
i := 0;
While Not Eof(F) do
Begin
Inc(i);
Readln(F,A[i]);
End;
Close(F);
End;

Advertisements

About pascalteacher

Trang thông tin Toán học và Tin học

Thảo luận

Không có bình luận

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất / Thay đổi )

Connecting to %s

Các tác giả

Chuyên mục

Tháng Tám 2015
H B T N S B C
« Th1   Th9 »
 12
3456789
10111213141516
17181920212223
24252627282930
31  

NCT Computer

Flickr Photos

Thống kê

  • 252,853 lượt xem

pascalteacher.nct@gmail.com


Trang huấn luyện học sinh giỏi Tin học

%d bloggers like this: