Bài toán 5: Trộn 2 mảng A gồm N phần tử và mảng B gồm M phần tử đã được sắp xếp tăng thành
1 dãy cũng được sắp xếp tăng. Ví dụ: Cho mảng A: 1 3 5 7 8 ; B: 2 3 6 9 10 14 thì ta được dãy
C: 1 2 3 3 6 7 8 9 10
Ý tưởng: + Lấy lần lượt từng phần tử từ 2 mảng A và B ra. So sánh giá trị của 2 phần tử, nếu phần
tử nào nhỏ hơn thì ghi vào mảng C, sau đó tiếp tục lấy ra 1 phần tử từ mảng chứa số vừa ghi vào
mảng C đó và so sánh với số chưa được ghi cho đến khi một hoặc cả 2 mảng A và B được lấy hết.
+ Nếu 1 trong 2 mảng còn một số phần tử chưa được lấy ra thì ta tiếp tục lấy rồi ghi vào
mảng C.
Đoạn chương trình xử lý:
program mang;
uses crt;
var m,n,x,i,j:longint; a,b:array[1..50] of longint;
c:array[1..100]of longint;
Begin
clrscr;
write('nhap so phan tu mang a la n:');readln(n);
write('nhap so phan tu mang b la m:');readln(m);
for i:=1 to n do
begin
write('a[',i,']=');read(a[i]);
end;
for j:=1 to m do
begin
write('b[',j,']=');read(b[j]);
end;
x:=0;i:=1;j:=1;
repeat
if a[i]begin
x:=x+1;
c[x]:=a[i];
i:=i+1;
end
else begin
x:=x+1;
c[x]:=b[j];
j:=j+1;
end;
until (i>n) or (j>m);
while i<=n do begin x:=x+1;c[x]:=a[i]; i:=i+1; end;
while j<=m do begin x:=x+1;c[x]:=b[j]; j:=j+1; end;
for i:=1 to x do write(c[i],' '); readln;
readln
End.
Bài tập 1:
Nhập một dãy A (mỗi số chỉ xuất 1 lần) có N (< 40) số tự nhiên và 1 số K.
Hãy xuất ra các phần tử có số lần xuất hiện trong dãy A từ K lần trở lên.
Dữ liệu nhập: file DAYSO.INP:
- Dòng 1: 2 số n và k cách nhau bởi 1 dấu cách.
- Dòng 2: dãy A.
Dữ liệu ra: file DAYSO.OUT: Xuất các số thỏa điều kiện trên.
{In phan tu xuat hien k lan tro len}
var i,j,k,n,tg,x,y:integer;
a:array[1..50] of integer;
b:array[1..100] of integer;
f,g:text;
begin
assign(f,'mang.inp'); assign(g,'mang.out');
reset(f); rewrite(g);
read(f,n); readln(f,k);
for i:=1 to n do read(f,a[i]);
fillchar(b,sizeof(b),0);
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin
tg:=a[i];
a[i]:=a[j];
a[j]:=tg;
end; x:=a[1]; y:=a[n];
{vì nếu giá trị của phần tử của mảng a lớn hơn số phần tử n thì số phần
tử của mảng b lớn hơn n. Cụ thể bằng Max(a[i]))
for i:=1 to n do inc(b[a[i]]);
for i:=x to y do if (b[i]<>0) and (b[i]>=k) then write(g,i,' ');
close(f); close(g);
end.
Bài 2. (Đề Tin học trẻ 2014-2015) Dãy đối xứng.
Cho một dãy gồm N số nguyên a 1, a2, …, aN; mỗi số có giá trị tuyệt đối không
quá 104
Yêu cầu: Hãy tìm dãy con đối xứng dài nhất trong dãy đã cho. (Dãy con là dãy các phần
tử liên tiếp có từ 2 phần tử trở lên)
Dữ liệu vào từ file văn bản DAYDX.INP:
• Dòng đầu tiên chứa số nguyên dương N (1 ≤ N ≤ 103).
• Dòng tiếp theo, chứa các số nguyên ai ( i = 1..N ), mỗi số cách nhau một dấu cách.
Kết quả ghi ra file văn bản DAYDX.OUT trên một dòng duy nhất hai số p, q cách nhau
một dấu cách là vị trí bắt đầu dãy con và dộ dài của dãy con đó, nếu không có dãy con
đối xứng ghi ra số 0. (Trong trường hợp có nhiều dãy con thỏa mãn, thì ghi dãy con đầu
tiên tìm được)
Ví dụ:
DAYDX.INP
DAYDX.OUT
10
1 2 1 12 13 15 13 12 4 9
45
7
1234567
0
Giải thích ví dụ: Dãy con đối xứng dài nhất là: 12 13 15 13 12 bắt đầu từ vị trí 4 có độ dài
5
Bài 3. Lựa chọn. (Câu 3 Tin học trẻ Nghệ An 2013-2014)
Viết chương trình Pascal có tên Bai3.pas giải bài toán sau:
Trong dịp khai trương mùa du lịch Cửa Lò. Một lớp cựu học sinh gồm n bạn tổ
chức gặp mặt. Biết rằng khoảng thời gian mà bạn thứ i có mặt tại địa điểm gặp là [ai, bi]
(ai
đã nhận lời mời tham gia buổi gặp mặt. Hãy giúp cô giáo chủ nhiệm xác định thời điểm
đến, sao cho tại thời điểm đó cô giáo có thể gặp được nhiều bạn trong lớp nhất.
Dữ liệu: Vào từ file văn bản LUACHON.INP:
Dòng đầu tiên ghi số nguyên dương n (n ≤ 1000);
·
Dòng thứ i trong số n dòng tiếp theo ghi 2 số nguyên không
âm ai, bi tương ứng với thời gian đến và đi của người thứ I ( i = 1,
2, ..., n.)
Kết quả: Ghi ra file văn bản LUACHON.OUT:
Dòng đầu tiên ghi số nguyên dương k là số lượng người đang có
mặt ở địa điểm tổ chức, tại thời điểm cô giáo đến;
Trong k dòng tiếp theo ghi chỉ số của k bạn có mặt ở địa điểm tổ
chức, tại thời điểm cô giáo đến, mỗi dòng ghi một chỉ số của một
bạn.
Ví dụ:
LUACHON.IN LUACHON.OUT
LUACHON.INP LUACHON.OUT
P
6
3
5
1
1 2
1
12
1
2 3
2
35
2 5
3
79
5 7
11 15
6 7
17 21
9 11
uses crt;
type mang=array [1..100] of integer;
const t1='luachon.inp';
t2='luachon.out';
var f,g:text;
a,b:mang ;
n,i,j,max,min,d,k,vt,imax:integer;
{==================================}
Begin
assign(f,t1);reset(f);
assign(g,t2);rewrite(g);
readln(f,n);
for i:=1 to n do
begin
read(f,a[i]);
readln(f,b[i]);
end;
max:=1;min:=a[1];
for i:=1 to n do
begin
if b[i]>max then max:=b[i];
if a[i]
end;
imax:=1;k:=0;
for d:=min to max do
begin
for i:= 1 to n do
if (d>=a[i]) and (d<=b[i]) then k:=k+1;
if k> imax then
begin
imax:=k;
vt:=d;
end;
k:=0;
end;
writeln(g,imax);
for i:=1 to n do
if(vt>=a[i]) and (vt<=b[i]) then writeln(g,i);
close(f);close(g);
end.
Bài 4: Đề thi HSG THPT Hải Dương
Tại một bến xe có n xe đến đậu để đón khách (5 < n < 20). Mỗi xe chỉ
đậu tại bến trong một khoảng thời gian nhất định trong ngày (giờ đến - giờ
đi). Hãy viết chương trình giúp ban quản lý kiểm soát số lượng xe đậu ở bến
tại một thời điểm bất kỳ trong ngày (từ 0 -> 23 giờ) và cho biết thời điểm
nào bến tập trung nhiều xe nhất
Dữ liệu vào: file ben.inp
- Dòng đầu cho biết số xe
- N dòng tiếp theo, mỗi dòng ghi 3 số cách nhau khoảng trắng lần lượt là: số
thứ tự của xe, giờ đến, giờ đi
- Dòng cuối ghi giờ cần thống kê xe
Dữ liệu ra: file xe.out
- Dòng đầu ghi tổng số xe đang đậu tại bến vào thời điểm thống kê
- Dòng thứ hai ghi số thứ tự của các xe đó cách nhau khoảng trắng.
- Dòng tiếp theo ghi thời điểm tại bến có nhiều xe nhất theo dạng:
thời gian: số thứ tự của các xe có tại bến cách nhau khoảng trắng
(nếu có nhiều thời điểm thì phải liệt kê tất cả)
Bài 5. Số âm lớn nhất. Đề HSG THPT Nghệ An
Cho một dãy gồm N số nguyên a1, a2, …, aN, mỗi số có giá trị tuyệt đối
không vượt quá 104.
Yêu cầu: Hãy tìm số nguyên âm lớn nhất X trong dãy đã cho.
Dữ liệu: Vào từ file văn bản Bai1.inp:
• Dòng đầu tiên chứa số nguyên dương N (1 ≤ N ≤ 104);
• N dòng tiếp theo, dòng thứ i chứa số nguyên ai.
Kết quả: Ghi ra file văn bản Bai1.out: Chỉ một dòng duy nhất là số X tìm
được. Trong trường hợp không có lời giải thì ghi ra số 0.
Ví dụ:
Bai1.inp
Bai1.out
5
-4
-4
3
2
-5
7
Đề HSG THPT Nghệ An 2009-2010
Dãy số đặc biệt
Dãy số A1, A2,..., AN được gọi là dãy số đặc biệt nếu nó thoả mãn các điều
kiện:
• Là dãy số giảm dần;
• Với mỗi Ai thì Ai hoặc là số nguyên tố hoặc là ước của một trong các
số từ A1 đến Ai-1.
Em hãy tìm dãy số đặc biệt dài nhất bắt đầu từ N.
Dữ liệu vào: Từ file văn bản DAYSO.IN là một số nguyên dương N (N <
10000).
Kết quả: Ghi ra file văn bản DAYSO.OUT là dãy số tìm được, các số ghi
cách nhau bởi dấu cách.
Ví dụ:
DAYSO.IN
DAYSO.OUT
12
12 11 7 6 5 4 3 2 1
Bài 1. Tổng max
Cho dãy gồm N số nguyên a1, a2,…, an. Tìm dãy con gồm một hoặc
một số phần tử liên tiếp của dãy đã cho có tổng các phần tử trong dãy là lớn
nhất.
Dữ liệu vào từ file văn bản TONGMAX.INP
• Dòng đầu tiên chứa một số nguyên dương N (N<106).
• Dòng thứ I trong N dòng tiếp theo chứa số ai (|ai|<1000).
Kết quả ghi ra file văn bản TONGMAX.OUT
• Dòng đầu tiên ghi vị trí của phần tử đầu tiên của dãy con tìm được.
• Dòng thứ hai ghi vị trí của phần tử cuối cùng của dãy con tìm được.
Dòng thứ ba ghi tổng các phần tử của dãy con tìm được.
Ví dụ:
TONGMAX.INP
8
12
-14
1
23
-6
22
-34
13
TONGMAX.OUT
3
6
40
const
fi='';
fo='';
var
dau,cuoi:longint;
max,t,n:longint;
f:text;
procedure
doc;
begin
assign(f,fi);
reset(f);
readln(f,n);
end;
procedure
xuly;
var
i,j,x:longint;
begin
dau:=1; cuoi:=1; j:=1;
max:=-maxlongint; t:=0;
for i:=1 to n do
begin
readln(f,x);
t:=t+x;
if t>max then begin max:=t; dau:=j;
cuoi:=i; end;
if t<0 then begin t:=0; j:=i+1; end;
end;
end;
procedure
xuat;
begin
assign(f,fi);
rewrite(f);
writeln(f,dau);
writeln(f,cuoi);
writeln(f,max);
close(f);
end;
begin
doc;
xuly;
xuat;
end.
Bi: Tin hc tr Ngh An 2008
N cháu ở nhà trẻ Hoa sen xếp thành vòng tròn. Lấy bạn
lớp trởng làm chuẩn gọi là vị trí số 1, vị trí của các bạn tiếp
theo đợc xác định khi đếm theo chiều kim đồng hồ. Các
cháu chơi một trò chơi nh sau: bắt đầu đếm từ bạn lớp trởng đến khi gặp bạn thứ K thì bạn thứ K bị loại ra khỏi
vòng. Lại đếm lại bắt đầu từ ngời tiếp theo khi gặp bạn thứ
K thì lại loại bạn này ra khỏi vòng. Cứ tiếp tục nh vậy cho
đến khi chỉ còn lại một bạn trong vòng. Hãy cho biết bạn
còn lại có vị trí là bao nhiêu.
N, K nhập vào từ bàn phím, kết quả đợc ghi vào file
Bai2.txt hoặc hiển thị lên màn hình gồm 3 dòng, dòng thứ
nhất ghi giá trị N, dòng thứ 2 ghi giá trị K, dòng thứ 3 ghi giá
trị vị trí của bạn còn lại.
ví dụ: Giá trị N và K đợc nhập vào là: N=5, K=3
kết quả sẻ là:
5
3
4
Bi 2:
uses crt;
var i,n,d,m,k: Integer;
a:array[1..100] of integer;
Begin
clrscr;
write('nhap n=');readln(n);
write('nhap k=');readln(k);
for i:=1 to n do a[i]:=i;
i:=1; d:=0; m:=n;
repeat
if i=n+1 then i:=1;
if a[i] <>0 then d:=d+1;
if d=k then
begin
a[i]:=0;
m:=m-1;
d:=0;
end;
i:=i+1;
Until m=1;
for i:=1 to n do if a[i]<>0 then writeln('vi tri do la:',i);
readln;
End.