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
Trang 1Bà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]<b[j] then
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
Trang 2- 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 a1, a2, …, aN; mỗi số có giá trị tuyệt đối không quá 10 4
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 a i ( i 1 N ), mỗi số cách nhau một dấu cách.
Trang 3Kế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ụ:
10
1 2 1 12 13 15 13 12 4 9
4 5
7
1 2 3 4 5 6 7
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
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à [a i , b i]
(a i <b i tương ứng là các thời điểm đến và rời khỏi địa điểm gặp mặt) Cô giáo chủ nhiệm
đã 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.INP LUACHON.OUT LUACHON.INP LUACHON.OUT
6
1 2
2 3
2 5
5 7
6 7
9 11
3 1 2 3
5
1 2
3 5
7 9
11 15
17 21
1 1
uses crt;
type mang=array [1 100] of integer;
Trang 4const 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]<min then min:=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
Trang 5Tạ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 (1N104);
N dòng tiếp theo, dòng thứ i chứa số nguyên a i
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
5 -4 3 2 -5 7
-4
Trang 6Đề 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ụ:
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ụ:
const fi='';
fo='';
TONGMAX.INP TONGMAX.OUT
8 12 -14 1 23 -6 22 -34 13
3 6 40
Trang 7var 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
Bài: Đề Tin học 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
Trang 8lớ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
Bài 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);
Trang 9readln; End