You are on page 1of 65

BÀI TẬP 1

Bài 1. Cộng hai số rất dài


Program Cong;
Uses crt;
Var I,n,j,max,r,t:integer; s1,s2:string[255];
a,b:array[1..1000] of array;
Begin Clrscr;
Write(‘Nhap so 1 ‘); readln(s1);
Write(‘Nhap so 2 ‘); readln(s2);
If length(s1)>length(s2) then max≔length(s1) else
max≔length(s2);
For i≔length(s1)+1 to max do s1≔’0’+s1;
For i≔length(s2)+1 to max do s2≔’0’+s2;
For i≔1 to max do begin val(s1[i],a[i],r);
Val(s2[i],b[i],r); end;
{Cong}
For i≔max downto 1 do begin
T≔a[i]+b[i];
If (t≥10) and (i<>1) then begin t≔t-10; b[i-1]≔b[i-1]+1;
end;
Str(t,k); kq≔k+kq; end;
Write(kq);
Readln end.

Bài 2. Trừ hai số rất dài


Program Tru;
Uses crt;
Var I,n,max,t,r:integer; a,b:array[1..1000] of
longint; s1,s2,k,kq:string[255];
Begin clrscr;
Write(‘Nhap so 1 ‘); readln(s1);
Write(‘Nhap so 2 ‘); readln(s2);
If length(s1)>length(s2) then max≔length(s1) else
max≔length(s2);
For i≔length(s1)+1 to max do s1≔’0’+s1;
For i≔length(s2)+1 to max do s2≔’0’+s2;
For i≔1 to max do begin val(s1[i],a[i],r);
val(s2[i],b[i],r); end;
For i≔max downto 1 do begin
If a[i]>b[i] then begin a[i]≔a[i]+10; b[i-1]≔b[i-
1]+1; end;
T≔a[i]-b[i];
Str(t,k); kq≔k+kq; end;
Write(kq);
Readln end.

3. Nhân hai số rất dài


Program Nhan;
Uses crt;
Var I,n,r,j:integer; a,b,c:array[1..1000] of
longint; s1,s2:string[255];
Begin Clrscr;
Write(‘Nhap so 1 ‘); readln(s1);
Write(‘Nhap so 2 ‘); readln(s2);
For i≔1 to length(s1) do val(s1[i],a[i],r);
For i≔1 to length(s2) do val(s2[i],b[i],r);
For i≔1 to length(s1) do
For j≔1 to length(s2) do begin
C[i+j]≔c[i+j]+a[i]*b[j]; end;
For i≔length(s1)+length(s2) downto 3 do begin
C[i-1]≔c[i-1]+c[i] div 10;
C[i]≔c[i] mod 10; end;
For i≔1 to length(s1)+length(s2) do write(c[i]);
Readln end.
4. Xé giấy
Valxia đã viết được một số rất lớn trên 1 cuộn giấy rất dài, em ấy định chạy đi
khoe với anh trai Peter về thành tích của mình thì em Kachia chạy vào phòng và
xé mảnh giấy đó thành nhiều mảnh nhỏ. Kết quả là trên mỗi mảnh có một vài
số, kí tự đã viết. Bây giời, Vaxia không thể nhớ chính xác số đó nhưng em biết
đó là số lớn nhất được thành từ các mảnh giấy nhỏ. Để làm hài lòng em trai
mình, Peter quyết định tìm số mà Valxia đã viết.
Program Xegiay;
Uses crt;
Var I,d,j,n:longint; max,h:string[255];
s:array[1..1000] of string;
T:array[1..1000] of Boolean; a:array[1..1000] of
string;
Procedure Incauhinh;
Begin H≔’’;
For i≔1 to n do begin d≔a[i]; h≔h+s[d]; end;
If max<h then max≔h; end;
Procedure try(i:longint);
Var j:integer;
Begin
For j≔1 to n do if t[j] then begin
A[i]≔j;
If i=n then incauhinh else begin t[j]≔false;
try(i+1); t[j]≔true; end;
End; end;

Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔1 to n do begin write(I,’. ‘); readln(s[i]);
end;
Fillchar(t,sizeof(t),true);
Try(1); write(max);
Readln end.

6. Mật mã (sắp xếp chuỗi theo thứ tự từ điển)


Program Matma;
Uses crt;
Program p,I,n:longint; s1:string[255]; ch:char;
f1,f2:text;
s:array[1..1000] of string;
Begin clrscr;
Assign(f1,’input.inp’); reset(f1);
Assign(f2,’output.out’); rewrite(f2);
Read(f1,p);
While not eof(f1) do begin
While not eoln(f1) do begin read(f1,ch);
If ch=’;’ then begin s[i]≔s1; s1≔’’; i≔i+1; end else
s1≔s1+ch;
End; readln(f1); end;
If s1<>’’ then s[i]≔s1; n≔I;
For i≔1 to n-1 do
For j≔I to n do
If s[i]>s[j] then begin
S1≔s[i]; s[i]≔s[j]; s[j]≔s1; end;
Write(f2,s[p]);
Close(f1); close(f2);
Readln end.

Bài 7. Dãy con tăng dài nhất, có tổng lớn nhất


Program Daycon;
Uses crt;
Var i,n,j,b,k,d,max,s,maxs,kt,x:longint;
a,c,kq,f:array[0..1000] of longint;
Procedure incauhinh;
begin
x:=0; kt:=0; s:=0;
for i:=1 to k do begin d:=a[i]; inc(x); f[x]:=c[d];
s:=s+c[d]; end;
for i:=1 to x do if f[i]<f[i+1] then inc(kt);
if (kt=x-1) and (max<x) and (maxs<s) then begin
maxs:=s; max:=x; for i:=1 to max do kq[i]:=f[i]; end;
end;
{----------------------------------------------------}
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
{----------------------------------------------------}
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin write(i,'. '); readln(c[i]);
end;
for k:=1 to n do begin try(1); i:=0; d:=0; end;
for i:=1 to max do write(kq[i],' '); writeln;
write('TONG LA: ',maxs);
readln end.

Bài 8. Bài toán tháp Hà Nội


Program Thap;
Uses crt;
Var I,n:longint; a,c:char;
Procedure in(a,c:char);
Begin
Writeln(‘Chuyen mot dia tut hap ‘,a,’ sang thap ‘,c);
End;
Procedure thap(n:longint;a,b,c:char);
Begin
If n=1 then in(a,c) else
Begin
Thap(n-1,a,c,b);
In(a,c); thap(n-1,b,a,c);
End; end;
Begin Clrscr;
Write(‘Nhap n ‘); readln(n);
Thap(n,’a’,’b’,’c’);
Readln end.
Bài 9. Ma trận
Xếp các số từ 1 đến 9 vào trong một ma trận có kích thước 3x3 sao cho các số
tạo thành ở mỗi hàng là số nguyên tố.
program matran;
uses crt;
var i,n,j,b,x,dem,d:longint; a,f,c:array[0..10000] of
longint; t:array[0..10000] of boolean;
s1,s2,s3:longint;
procedure incauhinh;
begin
x:=0; dem:=0; s1:=0; s2:=0; s3:=0;
for i:=1 to n do begin d:=a[i]; inc(x); f[x]:=c[d];
end;
s1:=f[1]*100+f[2]*10+f[3];
s2:=f[4]*100+f[5]*10+f[6];
s3:=f[7]*100+f[8]*10+f[9];
for i:=1 to s1 do if s1 mod i=0 then inc(dem);
for i:=1 to s2 do if s2 mod i=0 then inc(dem);
for i:=1 to s3 do if s3 mod i=0 then inc(dem);
if (dem=6) then begin for i:=1 to n do begin d:=a[i];
write(c[d],' '); end; writeln; end;
end;
procedure try(i:longint);
var j:integer;
begin
for j:=1 to n do if t[j] then begin
a[i]:=j;
if i=n then incauhinh else begin t[j]:=false;
try(i+1); t[j]:=true; end;
end; end;
begin clrscr;
n:=9;
for i:=1 to n do c[i]:=i;
fillchar(t,sizeof(t),true);
try(1);
readln end.
Bài 10. Xếp số
Cho dãy số nguyên dương đôi một khác nhau: a1, a2, ..., an. Một hoán vị của
dãy số là một cách sắp xếp khác các số hạng của dãy. Hãy liệt kê tất cả các
hoán vị của dãy đã cho thoả mãn: giữa hai phần tử bất kỳ M và N trong hoán
vị đó, không tồn tại phần tử P nào của hoán vị để: 2P = M + N
Ví dụ:   Với dãy: 11, 22, 33, 44 thì
Hoán vị 33 11 22 44  là thoả mãn điều kiện trên
Hoán vị 11 44 22 33 không thoả mãn vì có phần tử P = 22 nằm giữa hai
phần tử M = 11 và N = 33 mà:  22 * 2 = 11 + 33.

program Xeplaidayso;
uses crt;
var m,n,i,j,j1,i1,s,kt,x,p,d:longint;
f,a,c:array[1..100] of longint;
t:array[1..100] of boolean;
procedure incauhinh;
begin
x:=0; kt:=0;
for i:=1 to n do begin d:=a[i]; inc(x); f[x]:=c[d];
end;
for i:=1 to x do begin
for j1:=1 to i-1 do begin
for i1:=i+1 to x do if (f[i]*2=f[j1]+f[i1]) then
inc(kt);
end;
if kt=0 then for i:=1 to n do begin d:=a[i];
write(c[d]); end;
end;
{----------------------------------------------------}
procedure try(i:longint);
var j:integer;
begin
for j:=1 to n do if t[j] then begin
a[i]:=j;
if i=n then incauhinh else begin t[j]:=false;
try(i+1); t[j]:=true; end;
end;
{---------------------------------------------------}
begin clrscr;
write('Nhap n '); readln(n);
fillchar(t,sizeof(t),true);
for i:=1 to n do begin
write(i,'. '); readln(c[i]); end;
try(1);
readln end.

11. Bài toán quân hậu. Tìm tất cả các cách xếp 8 quân hậu trên bàn cờ sao cho
không có quân nào có thể ăn được nhau.
Program Hau;
Uses crt;
Var I,n,j,b,c,d:longint; t1,t2,t:array[-100..1000]
of Boolean;
A: array[1..1000] of longint;
Procedure incauhinh;
Begin
For i≔1 to 8 do write(‘( ‘,I,’ ; ‘,a[i],’ ) ‘);
writeln;
End;
Procedure try(i:longint);
Var j:integer;
Begin
For j≔1 to 8 do if t[j] and (t1[i+j]) and (t2[i-j])
then begin
A[i]≔j;
If i=8 then incauhinh else begin t[j]≔false;
t1[i+j]≔false; t2[i-j]≔false;
Try(i+1); t[j]≔true; t1[i+j]≔true; t2[i-
j]≔true; end;
End; end;
Begin clrscr;
Fillchar(t,sizeof(t),true);
fillchar(t1,sizeof(t1),true);
fillchar(t2,sizeof(t2),true);
Try(1);
Readln end.
Bài 12. Viết chương trình nhập vào một xâu tối đa 1000 kí tự, viết chương trình
tìm xâu đối xứng dài nhất trong xâu đó
program xaudoixungdainhat;
uses crt;
var i,n,j,b,max,d,kt,cuoi:longint;
s,kq,s1,s2:string[255];
begin clrscr;
write('Nhap s '); readln(s); cuoi:=length(s);
for i:=1 to length(s) do begin
while cuoi>=i do begin
for j:=i to cuoi do s1:=s1+s[j];
for j:=length(s1) downto 1 do s2:=s2+s1[j];
for j:=1 to length(s1) do if s1[j]=s2[j] then inc(kt);
if (kt=length(s1)) and (max<length(s1)) then begin
max:=length(s1); kq:=s1; end;
kt:=0; dec(cuoi); s1:=''; s2:=''; end;
cuoi:=length(s); end;
write(kq);
readln end.

Bài 13. Cho trước một xâu S, viết chương trình thêm vào xâu S đó ít kí tự
nhất để xâu S trở thành xâu đối xứng.
Ví dụ: edbabcd → e,c
program Themkitu;
uses crt;
var i,n,j,vt,b,k,j1,kt,max,t,d:longint;
a:Array[0..10000] of longint; c:array[0..100000]
of string;
s1,s2:string[255]; kq,ss1,ss2:string[255];
procedure incauhinh;
begin
vt:=0; ss1:=''; ss2:=''; kt:=0;
for i:=1 to k do begin d:=a[i]; ss1:=ss1+c[d]; end;
for i:=1 to length(ss1) do begin
for j1:=vt+1 to length(s2) do if s2[j1]=ss1[i] then
begin vt:=j1; ss2:=ss2+s2[j1]; break; end;
end;
for i:=1 to length(ss1) do if ss1[i]=ss2[i] then
inc(kt);
if (kt=length(ss1)) and (max<length(ss1)) then begin
max:=length(ss1); kq:=ss1; end;
end;

procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to length(s1)-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
begin clrscr;
write('Nhap s '); readln(s1);
for i:=1 to length(s1) do c[i]:=s1[i];
for i:=length(s1) downto 1 do s2:=s2+s1[i];
writeln(s2);
for k:=1 to length(s1) do begin try(1); i:=0; d:=0;
end;
for i:=1 to length(kq) do begin
for j:=1 to length(s1) do if s1[j]=kq[i] then begin
delete(s1,j,1); break; end;
end;
write(s1);
readln end.

Bài 14. Tìm dãy con chung lớn nhất của 2 dãy.
Program Chung;
Uses crt;
Var i,n,j,d,t,vitri:longint;
a:array[0..1000] of longint;
s1,s2,st1,st2,max:string[255];
s:array[0..1000] of string;
Procedure incauhinh;
Begin st1≔’’; st2≔’’;
For i≔1 to k do begin d≔a[i]; st1≔st1+s[d]; end;
End;
Procedure kiemtra;
Begin
vitri≔0;
For i≔1 to length(st1) do begin
For t≔vitri+1 to length(s2) do if s2[t]=s1[i] then
Begin
St2≔st2+s2[t];
Vitri≔t;
Break; end;
End;
If (length(st1)=length(st2)) and
(length(max)<length(st1)) then max:=st1;
End;
{---------------------------------------------------}
Procedure try(i:longint);
Var j:integer;
Begin
For j≔a[i-1]+1 to n-k+i do begin
A[i]≔j;
If i=k then begin incauhinh; kiemtra; end else
try(i+1); end;
End;
Procedure nhap;
Begin
Write(‘Nhap xau 1 ‘); readln(s1);
Write(‘Nhap xau 2 ‘); readln(s2);
N≔length(s1);
For i≔1 to n do s[i]≔s1[i];
For k≔1 to n do begin try(1); d≔0; i≔0; end;
Write(max);
End;
{---------------------------------------------------}
Begin clrscr;
Nhap;
Readln end.
Bài 15. Trò chơi với băng số
Nhập vào một mảng gồm n số nguyên dương. Hãy tìm cách chia mảng này
thành nhiều phần nhất có thể sao cho tổng mỗi phẫn là bằng nhau
Ví dụ:
BANGSO.INP BANGSO.OUT
10 3
5 1 2 2 10 2 3 2 1 2 5 1 2 2 10 23212

Program Bangso;
Uses crt;
Var i,n,j,sday,s,tong,x:longint;
a,uoc:array[1..1000] of longint;
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔1 to n do begin
Write(i,’. ‘); readln(a[i]); end;
for i≔1 to n do s≔s+a[i];
for i≔1 to s do if (s mod i=0) and (i<n) then begin
inc(x); uoc[x]≔i; end;
for i≔1 to x do begin
sday≔s div uoc[i];
for j≔1 to n do begin
tong≔tong+a[j];
If tong=sday then begin tong≔0; inc(kt); end;
End;
If kt=uoc[i] then write(uoc[i],’ ‘);
Kt≔0; tong≔0; end;
Readln end.
Bài 16. Tìm dãy con dài nhất có qui luật đi xuống rồi lên lại (giá vàng ổn định)
program Giavang;
uses crt;
var i,n,j,b,d,t,max,k,kt,vt,k1,k2,x:longint;
a,f1,kq,c:array[0..1000] of longint; f:text;
procedure Docfile;
begin
assign(f,'giavang.inp'); reset(f);
read(f,n);
while not eof(f) do
begin
inc(i);
read(f,c[i]);
end;
close(f);
end;

procedure incauhinh;
begin x:=0;
for i:=1 to k do
begin
d:=a[i];
x:=x+1;
f1[x]:=c[d];
end;
end;

procedure kiemtra;
begin k1:=0; k2:=0;
for i:=1 to x do
begin
if (f1[i]>f1[i+1]) and (k2=0) then
inc(k1);
if (f1[i]<=f1[i+1]) then inc(k2);
end;
if (k2+k1=x-1) and (max<x) then
begin
max:=x;
for i:=1 to max do kq[i]:=f1[i];
end;
for i:=1 to max do f1[i]:=0;
end;

procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do
begin
a[i]:=j;
if i=k then
begin
incauhinh; kiemtra; end else
try(i+1);
end;
end;

procedure CT;
begin
i:=0; Docfile;
for k:=1 to n do
begin
try(1); i:=0; d:=0;
k1:=0; k2:=0;
end;
assign(f,'giavang.out'); rewrite(f);
for i:=1 to max do write(f,kq[i],' ');
close(f);
end;

begin clrscr;
CT;
readln end.
Bài 17. Tìm dãy con đơn điệu dài nhất
program Daycondondieudainhat;
uses crt;
var k1,k2,n,k,kt,i,j,d,max,x:longint;
kq,a,c,f:array[0..1000] of longint;
procedure incauhinh;
begin x:=0;
for i:=1 to k do begin d:=a[i]; x:=x+1;
f[x]:=c[d]; end;
end;

procedure kiemtra;
begin k1:=0; k2:=0; kt:=0;
for i:=1 to x do
begin
if (f[i]>f[i+1]) then begin k1:=i;
break; end;
if (f[i]<f[i+1]) then begin k2:=i;
break; end;
end;
if k1=1 then
begin
for i:=1 to x do
begin
if k1 mod 2<>0 then
begin
if (f[i]>=f[i+1]) and
(i mod 2<>0) then kt:=kt+1;
if (f[i]<=f[i+1]) and
(i mod 2=0) then kt:=kt+1;
end;
if k1 mod 2=0 then
begin
if (f[i]>=f[i+1]) and
(i mod 2=0) then inc(kt);
if (f[i]<=f[i+1]) and
(i mod 2<>0) then inc(kt);
end;
end;
end;
{-----------------------------------------------------
--------------------------------------}
if k2=1 then
begin
for i:=1 to x do
begin
IF k2 mod 2<>0 then
begin
if (f[i]<=f[i+1]) and
(i mod 2<>0) then inc(kt);
if (f[i]>=f[i+1]) and
(i mod 2=0) then inc(kt);
end;
if k2 mod 2=0 then
begin
if (f[i]<=f[i+1]) and
(i mod 2=0) then inc(kt);
if (f[i]>=f[i+1]) and
(i mod 2<>0) then inc(kt);
end;
end;
end;
if (kt=x-1) and (max<x) then
begin
max:=x;
for i:=1 to max do kq[i]:=f[i];
end;
end;

procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do
begin
a[i]:=j;
if i=k then begin incauhinh; kiemtra;
end else try(i+1);
end;
end;
procedure nhap;
begin
write('Nhap n '); readln(n);
for i:=1 to n do
begin
write(i,'. '); readln(c[i]);
end;
for k:=1 to n do begin try(1); i:=0; d:=0;
end;
for i:=1 to max do write(kq[i]:5);
end;

begin clrscr;
nhap;
readln end.

Bài 18. Tìm tất cả các số tự nhiên (>10,<65535) thoả điều kiện:
a) Là số fibonacci
b) Có ít nhất một số nguyên tố được tạo thành khi đổi chỗ các chữ số của nó
Chương trình:
Program timso;
Uses crt;
Var i,n,j1,x,i1,j,so,d,kt,f0,f1,f2:longint;
r:integer; t:array[0..1000] of boolean;
A,c:array[0..100] of longint; s1,s2:string[255];
s:array[0..1000] of string;
{---------------TIN SO FIBONACCI---------------------}
Procedure Fibon;
Begin
F0≔1; f1≔1;
While f2≤65535 do begin
F2≔f0+f1; F0≔f1; F1≔f2;
Inc(n); c[n]≔f2; end;
End;
{------------KIEM TRA, DAO SO VA KT NGUYENTO--------}
Procedure incauhinh;
Begin
S2≔’’;
For i≔1 to x do begin d≔a[i]; s2≔s2+s[d]; end;
End;

Procedure nguyento;
Begin
Kt≔0; d≔0;
Val(s2,so,r);
For i≔1 to so do if so mod i=0 then inc(d);
If d=2 then inc(kt);
End;
Procedure try(i:longint);
Var j:integer;
Begin
For j≔1 to x do if t[j] then begin
A[i]≔j;
If i=x then begin incauhinh; nguyento; end else begin
t[j]≔false; try(i+1);
T[j]≔true; end;
End; end;
Begin clrscr;
Fibon;
For i1≔1 to n do begin
Str(c[i1],s1); x≔length(s1);
For j1≔1 to x do s[j1]≔s1[j1];
Fillchar(t,sizeof(t),true); kt≔0;
Try(1);
If kt≥1 then write(c[i1],’ ‘);
End;
Readln end.

Bài 19. Nhập vào một mảng gồm n phần tử. Hãy tìm dãy con có tổng lớn nhất
sao cho không có 3 phần tử nào được đứng liên tiếp nhau.
Vd: 1 2 3 4 5
Dãy thoả điều kiện: 1 2 4 5
Dãy không thoả điều kiện: 1 2 3 5: (1 2 3 là 3 phần tử liên tiếp nhau trong dãy
mẹ).
program phanthuong;
uses crt;
var i,n,j,j1,i1,d,s,dai,x,k,kt,max:longint;
a,c,f,f1,f2,kq:array[0..1000] of longint;
procedure incauhinh;
begin
x:=0;
for i:=1 to k do begin d:=a[i]; s:=s+c[d];
inc(x); f[x]:=c[d]; end;
end;
{----------------------------------------------------}
procedure xuli;
begin
d:=0; kt:=0;
for i:=1 to x do begin
for j1:=1 to n do if f[i]=c[j1] then
begin
f1[1]:=f[i]; f1[2]:=f[i+1];
f1[3]:=f[i+2];
f2[1]:=c[j1]; f2[2]:=c[j1+1];
f2[3]:=c[j1+2];
for i1:=1 to 3 do if (f1[i1]=f2[i1])
and (f1[i1]<>0) and (f2[i1]<>0) then inc(d);
if d>=3 then inc(kt);
d:=0;
end;
end;
if (kt=0) and (max<s) then
begin
for i:=1 to x do kq[i]:=f[i];
dai:=x;
max:=s;
end;
end;
{---------------------------------------------------}
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do begin
a[i]:=j;
if i=k then begin incauhinh; xuli; end
else try(i+1);
end;
end;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin
write(i,'. '); readln(c[i]); end;
for k:=1 to n do begin try(1); i:=0; d:=0; end;
for i:=1 to dai do write(kq[i]:5);
readln end.

Bài 20. Nhập một danh sách nhân viên gồm họ tên, ngày tháng năm sinh, sắp
xếp danh sách đó tăng dần theo tuổi
program hoso;
uses crt;
type hoso=record
ten:string[35];
ngay,thang,nam:longint;
end;
var i,n,j,b,c,d,t:longint; a:array[1..1000] of hoso;
s:string[255];
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin
writeln('NHAP THONG TIN NHAN VIEN THU ',i);
write('Nhap ten: '); readln(a[i].ten);
write('Nhap - ngay - thang nam sinh: ');
readln(a[i].ngay,a[i].thang,a[i].nam);
end;
for i:=1 to n-1 do
for j:=i to n do if (a[i].nam>a[j].nam) or
((a[i].nam=a[j].nam) and (a[i].thang>a[j].thang))
or ((a[i].nam=a[j].nam) and (a[i].thang=a[j].thang)
and (a[i].ngay>a[j].ngay)) then begin
t:=a[i].nam; a[i].nam:=a[j].nam; a[j].nam:=t;
t:=a[i].thang; a[i].thang:=a[j].thang; a[j].thang:=t;
t:=a[i].ngay; a[i].ngay:=a[j].ngay; a[j].ngay:=t;
s:=a[i].ten; a[i].ten:=a[j].ten; a[j].ten:=s; end;
for i:=1 to n do write(a[i].ten,' ');
readln end.

Bài 21. Viết chương trình tạo một bảng cho phép nhập câu hỏi, 4 đáp án ABCD
và đáp án đúng. Sau đó, nhập câu trả lời của bạn cho từng câu hỏi. Nếu câu trả
lời đúng với đáp àn thì in ‘DUNG’ ngược lại ‘SAI’.
program Hoso;
uses crt;
type tracnghiem=record
cauhoi:string[25];
d1,d2,d3,d4:char;
dapan:char;
kq:string[8];
end;
var a:array[1..10] of tracnghiem; d:array[1..10] of
char; ch:char;
i,n,j,b,c:longint;
begin clrscr;
for i:=1 to 3 do begin
writeln('Nhap thong tin cau hoi so ',I);
write('Nhap cau hoi: '); readln(a[i].cauhoi);
write('A. '); readln(a[i].d1);
write('B. '); readln(a[i].d2);
write('C. '); readln(a[i].d3);
write('D. '); readln(a[i].d4);
write('Nhap dap an: '); ch:=readkey;
ch:=upcase(ch); a[i].dapan:=ch; WRITELN; END;
writeln('Nhap dan an cua ban ');
for i:=1 to 3 do begin
write(i,'. '); readln(d[i]); d[i]:=upcase(d[i]); end;
for i:=1 to 3 do if a[i].dapan=d[i] then a[i].kq:='DUNG'
else a[i].kq:='SAI';
for i:=1 to 3 do
with a[i] do begin
write('|',cauhoi,#32:25-length(cauhoi),'|',dapan,#32:8-
1,'|',d[i],#32:8-1,'|',kq,#32:8-length(kq),'|');
writeln; end;
readln end.

Bài 22. Phần tử a[i,j] được gọi là phần tử yên ngựa nếu nó là phần tử lớn nhất
trong dòng i và nhỏ nhất trong cột j. Cho trước một mảng có kích thước nxm.
Viết chương trình tìm phần tử yên ngựa trong đó.
Program PTYN;
Uses crt;
Var max,min,cot,dong,i,j,n,j1:longint;
a:array[1..100,1..100] of longint; f:text;
Begin clrscr;
Assign(f,’PTYN.inp’); reset(f);
While not eof(f) do begin
Inc(dong);
While not eoln(f) do begin
Inc(cot);
Read(f,a[dong,cot]);
End;
N≔cot; cot≔0; readln(f); end;
Cot≔n; close(f);
For i≔1 to dong do
For j≔1 to cot do begin
For j1≔1 to dong do if max<a[j1,j] then max≔a[j1,j];
For j1≔1 to cot do if min>a[i,j1] then min≔a[i,j1];
If max=min then writeln(i,’ ‘,j);
Max≔0; end;
Readln
End.

Bài 23. Kết quả xổ số


Có N người (đánh số từ 1 đến N) tham gia một đợt xổ số điện toán. Mỗi
người nhận được một thẻ gồm M ô (đánh số từ 1 đến M). Người chơi được chọn
K ô trong số các ô đã cho bằng cách đánh dấu các ô được chọn. Sau đó các thẻ
này được đưa vào máy tính để xử lý. Máy tính chọn ra K ô ngẫu nhiên (kết quả) và
chấm điểm từng thẻ dựa vào kết quả đã sinh. Cứ mỗi ô chọn đúng với ô kết quả
thì thẻ chơi được tính 1 điểm. Giả thiết biết các ô chọn cũng như các điểm tương
ứng của từng thẻ chơi, hãy xác định tất cả các kết quả có thể có mà máy sinh ra.

INPUT: Dữ liệu đọc từ file Xoso.inp bao gồm:

Dòng đầu ghi các số n,m,k

Dòng thứ i trong n dòng tiếp theo ghi thẻ của người chơi gồm k số; số cuối cùng là
số điểm

OUTPUT: Ghi ra kết quả file Xoso.out, mỗi dòng là k số thể hiện kết quả mà máy
tính đã chọn.
XOSO.INP XOSO.OUT
594 1234

24682 2347

56890

24562

12373

35691

program xoso;
uses crt;
var i,n,j,m,k,kt,i1,j1,dong,cot,d,t,x:longint;
a,f,c,dapan:array[0..1000] of longint;
xoso:array[0..100,0..100] of longint; file1:text;
procedure docfile;
begin
assign(file1,'xs.inp'); reset(file1);
read(file1,n,m,k); readln(file1);
while not eof(file1) do begin
inc(dong);
while not eoln(file1) do begin inc(cot); if cot<=k
then read(file1,xoso[dong,cot]) else
read(file1,dapan[dong]); end;
x:=cot; cot:=0; readln(file1); end; close(file1);
cot:=x-1; x:=0;
end;
procedure incauhinh;
begin
x:=0; kt:=0;
for i:=1 to k do begin d:=a[i]; inc(x); f[x]:=c[d];
end; d:=0;
for i:=1 to dong do
for t:=1 to cot do begin
for j1:=1 to x do if f[j1]=xoso[i,t] then inc(kt);
if t=cot then begin if kt=dapan[i] then inc(d); kt:=0;
end;
end;
if d=dong then begin for i:=1 to x do write(f[i],'
'); writeln; end;
end;
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to m-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
begin clrscr;
docfile;
for i:=1 to m do c[i]:=i; try(1);
readln end.

Bài 24. Nhà bác học Neli Soloan đưa ra khái niệm độ bền của số như sau:
+ Nếu n có 1 chữ số thì độ bền bằng 0
+ Nếu n có 2 chữ số trở lên thì độ bền bằng độ bền có số nguyên x (với x là tích
các chữ số của n) cộng 1.
Hãy viết chương trình tính độ bền của 1 số
Vs: 99 = doben(81)+1 = doben(8)+1+1=0+1+1=2
Program Doben;
Uses crt;
Var i,d,n,j,tich,r:integer; s:string[255];
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
Str(n,s);
While length(s)>1 do begin
Tich≔1;
For i≔1 to length(s) do begin val(s[i],j,r);
tich≔tich*j; end;
Str(tich,s); inc(d); end; inc(d);
Write(‘DO BEN LA: ‘,d);
Readln end.

Bài 25. Chia kẹo


Có n túi kẹo, túi thứ i có ai viên, hãy chia các túi này thành 2 phần sao cho
tổng chênh lệch các phần là nhỏ nhất
Ví dụ: 30,25,40,20,26,30,20 có thể chia thành 2 phần là:
+ 30+25+40=95
+ 20+26+20+30=96 (96-95=1)
program chiakeo;
uses crt;
var s2,s1,min,x,y,d1,d2,d,k,n,i,s,j:longint;
k1,k2,a,f1,f2,c,t:array[0..100] of longint;
procedure incauhinh;
begin
x:=0; y:=0; s1:=0; s2:=0;
for i:=1 to k do begin d:=a[i]; s1:=s1+c[d];
inc(x); f1[x]:=c[d]; c[d]:=-1; end;
end;

procedure xuli;
begin
for i:=1 to n do if c[i]<>-1 then begin
inc(y); f2[y]:=c[i]; s2:=s2+c[i]; end;
if (min>s1-s2) and (s1-s2>0) then begin
min:=s1-s2;
d1:=x;
d2:=y;
for i:=1 to d1 do k1[i]:=f1[i];
for i:=1 to d2 do k2[i]:=f2[i];
end;
for i:=1 to n do c[i]:=t[i];
for i:=1 to x+y do begin f1[i]:=0; f2[i]:=0;
end;
end;

procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do begin
a[i]:=j;
if i=k then begin incauhinh; xuli; end
else try(i+1);
end;
end;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin
write(i,'. '); readln(c[i]); end;
for i:=1 to n do begin t[i]:=c[i]; min:=min+c[i]; end;
for k:=1 to n do begin try(1); i:=0; d:=0; end;
writeln(min);
for i:=1 to d1 do write(k1[i],' ');
writeln;
for i:=1 to d2 do write(k2[i],' ');
readln end.

Bài 26. Kí hiệu S(n) là tổng các chữ số của n trong hệ số thập phân. Hãy viết
chương trình
A) Tính tổng s(n) của số nguyên dương n
b) In ra số nguyên y nhỏ nhất thoả mãn s(y)=s(n)
c) In ra số nguyên z nhỏ nhất thoả mãn s(z+n)=s(z)+s(n);
program sn;
uses crt;
var y,z,n,i,j,b,c,d:longint; s:string[255];
t,t1,t2,tong:longint; r:integer;
begin clrscr;
write('Nhap n '); readln(n);
str(n,s);
for i:=1 to length(s) do begin val(s[i],b,r);
tong:=tong+b; end;
writeln('TONG SN LA: ',tong);
for i:=1 to n do begin
str(i,s);
for j:=1 to length(s) do begin val(s[j],b,r); t:=t+b;
end;
if t=tong then begin writeln('SO Y LA: ',i); break;
end;
t:=0; end; t:=0;
for i:=1 to n do begin
d:=i+n; str(d,s);
for j:=1 to length(s) do begin val(s[j],b,r);
t1:=t1+b; end;
str(i,s);
for j:=1 to length(s) do begin val(s[j],b,r);
t2:=t2+b; end;
if t1=t2+tong then begin writeln('SO Z LA: ',i);
break; end;
t1:=0; t2:=0; end;
readln end.

Bài 27. Viết chương trình cộng, trừ, nhân, chia hai phân số. Rút gọn kết quả
sau khi tính.
program phanso;
uses crt;
var
i,n,j,b,c,d,ts1,ts2,ms1,ms2,ms,ts,ucln,bcnn:longint;
chung:byte;
procedure cong;
begin
ts:=ts1+ts2;
ms:=ms1;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ms:=ms div ucln;
ts:=ts div ucln;
writeln(ts,'/',ms);
end;
procedure tru;
begin
ts:=ts1-ts2;
ms:=ms1;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ms:=ms div ucln;
ts:=ts div ucln;
writeln(ts,'/',ms);
end;
procedure nhan;
begin
ts:=ts1*ts2; ms:=ms1*ms2;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ts:=ts div ucln; ms:=ms div ucln;
writeln(ts,'/',ms);
end;
procedure chia;
begin
ts:=ts1*ms2; ms:=ms2*ts2;
for i:=ms downto 1 do if (ms mod i=0) and (ts mod i=0)
then begin ucln:=i; break; end;
ts:=ts div ucln; ms:=ms div ucln;
write(ts,'/',ms);
end;
begin clrscr;
write('Nhap phan so 1 '); readln(ts1,ms1);
write('Nhap phan so 2 '); readln(ts2,ms2);
for i:=1 to ms1*ms2 do if (i mod ms1=0) and (i mod
ms2=0) then begin bcnn:=i; break; end;
chung:=bcnn div ms1;
ts1:=ts1*chung; ms1:=ms1*chung;
chung:=bcnn div ms2;
ts2:=ts2*chung; ms2:=ms2*chung;
write(ts1,' ',ms1); writeln;
write(ts2,' ',ms2); writeln; cong; tru; nhan;
chia;
readln end.

Bài 28. Bờm là một chủ cửa hiệu giày. Một ngày, khi vào kho, bờm thấy còn
2*n chiếc giày chưa bán, chiếc giày bên chân trái có kích thước lần lượt là
a1,a2,a3…an. Chiếc giáy bên chân phải có kích thước lần lượt là b1,b2,b3…
bn. Hai chiếc giày có thể hợp cùng một đôi nếu chúng có cùng kích thước.
Bờm quyết định mang một số giày đến nhà sản xuất để đổi.
Hãy xác định số giày ít nhất mà Bờm cần đổi để bán được n chiếc giày.
Ví dụ:
Bom.inp Bom.Out
3 1
131
123

Giải thích: Đổi 1 chiếc giày chân trái kích thuóc 1 thành 1 chiếc giày chân
phải kích thước 2. Hoặc đổi 1 chiếc giày chân phải kích thước 2 thành 1 chiếc
giày chân trái kích thước 1.
program h;
uses crt;
var x,i,n,j,d:longint; a,b:array[1..100] of longint;
f:text;
begin clrscr;
assign(f,'bom.inp'); reset(f);
readln(f,n);
while not eof(f) do
begin
while not eoln(f) do begin inc(x);
read(f,a[x]); end;
x:=0; readln(f);
while not eoln(f) do begin inc(x);
read(f,b[x]); end;
end;
close(f);
assign(f,'bom.out'); rewrite(f);
for i:=1 to n do
begin
for j:=1 to n do if a[i]=b[j] then begin
b[j]:=-1; break; end;
end;
for i:=1 to n do if b[i]<>-1 then inc(d);
write(f,d);
close(f);
readln end.

Bài 29. Một vòng tròn chứa 2n vòng tròn nhỏ. Các vòng tròn nhỏ được đánh số
từ 1 đến n theo chiều kim đồng hồ. Cần điền một số tự nhiên từ 1 đến 2n vào
mỗi vòng tròn nhỏ (mỗi số chỉ được phép điền một lần) sao cho tổng của hai số
trên hai vòng tròn nhỏ liên tiếp là số nguyên tố. Số điền ở vòng tròn nhỏ 1 luôn
là số 1.
Ví dụ:
Circuit.inp Circuit.Out
4 12385674
12583476
14765832
16743852

Program Circuit;
Uses crt;
Var i,n,j,s,i1,x,kt,d:longint; a,f,c:array[0..1000]
of longint;
t:array[1..1000] of boolean;
Procedure incauhinh;
begin
x:=0; kt:=0;
For i:=1 to n do begin d:=a[i]; inc(x); f[x]:=c[d];
end;
d:=0;
For i:=1 to x do begin
s:=f[i]+f[i+1];
For i1:=1 to s do if s mod i1=0 then inc(d);
If d=2 then inc(kt);
d:=0; end; d:=0;
for i:=1 to f[x] do if f[x] mod i=0 then inc(d);
if (kt=x-1) and (d<>2) and (f[1]=1) then begin for
i:=1 to n do begin d:=a[i]; Write(c[d]); end; writeln;
end;
end;
{----------------------------------------------------}
procedure try(i:longint);
var j:integer;
begin
for j:=1 to n do if t[j] then begin
a[i]:=j;
if i=n then incauhinh else begin t[j]:=false;
try(i+1); t[j]:=true; end;
end; end;
{----------------------------------------------------}
begin clrscr;
write('Nhap n '); readln(n); n:=n*2;
for i:=1 to n do c[i]:=i;
fillchar(t,sizeof(t),true);
try(1);
readln end.

Bài 30. Viết chương trình chuyển đổi giữa 2 hệ cơ số vào và ra (từ 1 → 16).
Nhập vào màn hình số n ở hệ cơ số vào, xuất ra kết quả n ở hệ cơ số ra.
Chuyển số n từ hệ cơ số vào sang hệ cơ số 10 bằng công thức:
Hệ cơ số 10=Cơ số vào^ vị trí-1*vị trí trong hằng mảng
Vd: 1001=2^3*1+2^2*0+2^1*0+2^0*1=9 9 (hệ cơ số 2)
Chuyển số đó sang hệ cơ số ra.
Nhập từ màn hình In kết quả ra màn hình
Hệ cơ số vào: 16 Số ở hệ thập phân là: 378
Nhập số: 17A Số ở hệ cơ số 3 là: 112000
Hệ cơ số ra: 3

program Coso;
uses crt;
const a:array[0..15] of
char=('0','1','2','3','4','5','6','7','8','9','A','B','C
','D','E','F');
var i,cs1,kt,gt,cs2,n,kq,j,x,k:byte; s,s2:string[255];
{------------------NHAP CO VAO RA----------------------}
procedure nhap;
begin
repeat
if kt>=1 then writeln('XIN NHAP LAI: ');
kt:=0;
write('Nhap co so vao: '); readln(cs1);
write('Nhap so do: '); readln(s);
x:=length(s);
write('Nhap co so ra '); readln(cs2);
if (cs1<1) or (cs2<1) or (cs1>16) or (cs2>16)
then inc(kt);
until kt=0;
end;
{--------------CHUYEN SANG THAP PHAN-------------------}
procedure chuyenTP(s:string);
begin
for i:=1 to length(s) do
begin
dec(x); gt:=1;
for j:=1 to x do gt:=gt*cs1;
for j:=0 to 15 do if s[i]=a[j] then begin
k:=j; break; end;
kq:=kq+(k*gt);
end;
writeln('SO O HE CO SO 10: ',kq);
end;
{---------------------CHUYEN DOI-----------------------}
procedure chuyendoi(kq:longint);
begin
k:=0;
while kq>=1 do begin
k:=kq mod cs2;
s2:=s2+a[k];
kq:=kq div cs2; end;
write('SO DA CHUYEN DOI LA: ');
for i:=length(s2) downto 1 do write(s2[i]);
end;
{------------------------------------------------------}
begin clrscr;
nhap;
chuyenTP(s); chuyendoi(kq);
readln end.

Bài 31. Hoán vị thuận thế


Cho a = (a 1 , a 2 , ...., a N ) là một hoán vị của dãy số tự nhiên 1...N. Ta xây
dựng dãy b=(b 1 ,b 2 ,...,b N ) và gọi là thuận thế của hoán vị a như sau:
Với mọi i =1..N, b i là số lượng các phần tử nhỏ thua a i và đứng trước a i
Ví dụ: N =7 ; a=(6,1,3,5,7,4,2) ta có thuận thế của a là b=(0,0,1,2,4,2,1)
a. Cho N và một hoán vị a. Hãy tìm thuận thế của a.
b. Cho N và một thuận thế b. Hãy tìm hoán vị sinh ra thuận thế b.
Ví dụ:
Nhập N = 9; a=217654389
Thuận thế của a là : 0 0 2 2 2 2 2 7 8
Nhập N = 9; b=011241558
Hoán vị sinh ra thuận thế b: 1 5 3 4 8 2 7 6 9
Program Hoanvithuanthe;
Uses crt;
Var i,n,j,d,i1,j1,x,l,kt,k:longint;
a,b,c,f:array[0..1000] of longint;
t:array[0..1000] of boolean;
Procedure incauhinh;
Begin
x:=0; kt:=0;
for i:=1 to n do begin d:=a[i]; inc(x);
c1[x]:=c[d]; end;
d:=0;
{CHUYEN HOAN VI RA THUAN THE VA SO SANH}
for i:=1 to x do begin
for j1:=1 to i do if c1[j1]<c1[i] then
inc(d);
f[i]:=d;
d:=0;
end;
for i:=1 to x do if b1[i]=f[i] then inc(kt);
if kt=x then for i:=1 to x do begin d:=a[i];
write(c[d],' '); end;
End;
{----------------------------------------------------}
Procedure try(i:longint);
var j:integer;
begin
for j:=1 to n do if t[j] then begin
a[i]:=j;
if i=n then incauhinh else begin t[j]:=false;
try(i+1); t[j]:=true; end;
end;
end;
{----------------------------------------------------}
Begin clrscr;
Write('Nhap n '); readln(n);
Writeln('Nhap hoan vi a: ');
For i:=1 to n do begin
Write(i,'. '); readln(a[i]); end;
For i:=1 to n do begin
For j:=1 to i do if a[j]<a[i] then inc(d);
b[i]:=d;
D:=0; end;
For i:=1 to n do write(b[i],' ');
Writeln('Nhap hoan vi thuan the: ');
For i:=1 to n do begin
Write(i,'. '); readln(b1[i]); end;
Fillchar(t,sizeof(t),true);
For i:=1 to n do c[i]:=i;
Try(1);
Readln end.

Bài 32. Thỏ và carốt


Trong một mảnh vườn hình chữ nhật có cạnh m, n người ta trồng cà rốt trong
những ô đơn vị hình vuông có cạnh 1. Trong mảnh vườn này có một chú thỏ ở
trong một hang chiếm diện tích 1 ô vuông đơn vị, chú thỏ này cần xác định
niền người ta đã trồng cà rốt có diện tích (Hai miền khác nhau không có một
cạnh ô vuông nào chung) lớn nhất trong mảnh vườn để đào một đường hầm
ngắn nhất theo phương dọc hoặc phương ngang từ hang đến phần diện tích
lớn nhất đó.
Dữ liệu vào từ file văn bản Tho.INP.
Dòng đầu tiên ghi x, y với x, y là hàng và cột của hang Thỏ trong vườn.
Trong M dòng tiếp theo, mỗi dòng có N ký tự 0 hoặc 1 thể hiện hàng thứ i của
mảnh vườn với ý nghĩa 0 là không trồng cà rốt, 1 là có trồng cà rốt.
Kết quả: Ghi ra file văn bản Tho.OUT:
Dòng đầu ghi S là chiều dài của đường hầm (S=0 nếu hang thỏ đang ở trên
phần trồng cà rốt có diện tích lớn nhất
Nếu s>0 thì trong các dòng tiếp theo lần lượt ghi hàng và cột của các ô trên
đường hầm bắt đầu từ hang thỏ đến vùng diện tích lớn.
Tho.inp Tho.Out
6611 4
000011 11
000011 12
000011 13
000011 14
000011 15
111000
Program Tho;
Uses crt;
Var i,n,j,i1,i11,j1,k,max,dong,cot,kt,m:longint;
a,b:array[1..10,1..10] of longint;
f:text; dodai:byte; dong1,cot1,x1,y2,x2,y1:byte;
{TIM HCN CO DIEN TICH LON NHAT}
procedure tim;
begin
for i:=1 to dong do
for j:=1 to cot do begin
for i11:=i to dong do begin
for i1:=i to i11 do
for j1:=j to cot do if a[i1,j1]=1 then inc(kt);
if (kt=i11*(cot-j)) and (max<(i11*(cot-j))) then begin
y2:=cot; y1:=j;
x1:=i; x2:=i11; max:=i11*(cot-j); end;
kt:=0; end;
end;
end;
{----------------------------------------------------}
procedure dichuyen;
begin
writeln('DI CHUYEN: '); kt:=0;
if dong1>x1 then while dong1>x1 do begin dec(dong1);
inc(kt); writeln(dong1,' ',cot1); end;
if dong1>x2 then while dong1>x2 do begin dec(dong1);
inc(kt); writeln(dong1,' ',cot1); end;
if (dong1=x1) or (dong1=x2) then begin
while cot1<=y1 do begin inc(cot1); writeln(dong1,'
',cot1); end;
while cot1>=y2 do begin inc(cot1); writeln(dong1,'
',cot1); end;
end;
end;
{----------------------------------------------------}
begin clrscr;
assign(f,'tho.inp'); reset(f);
read(f,dong1); read(f,cot1); readln(f);
while not eof(f) do begin
inc(dong);
while not eoln(f) do begin inc(cot);
read(f,a[dong,cot]); end;
m:=cot; cot:=0; readln(f); end;
close(f); cot:=m;
tim; writeln(max);
dichuyen;
readln end.

Bài 33. Vắt sữa


Ba bác nông dân thức dậy vào lúc 5 giờ sáng và chuẩn bị công việc của mình:
mỗi bác phải vắt sữa một con bò của mình. Bác nông dân đầu tiên bắt đầu vắt
sữa con bò của mình tại thời điểm 300 (tính bằng giây sau 5 giờ) và kết thúc tại
thời điểm 1000. Bác nông dân thứ hai bắt đầu tại thời điểm 700 và kết thúc tại
thời điểm 1200. Bác nông dân thứ ba bắt đầu tại thời điểm 1500 và kết thúc tại
thời điểm 2100. Thời gian liên tục dài nhất mà tại thời điểm bất kỳ nào trong
thời gian đó luôn có ít nhất một bác nông dân vắt sữa là 900 giây (từ thời điểm
300 đến 1200). Thời gian liên tục dài nhất mà bất kỳ thời điểm nào trong thời
gian này đều không có sự vắt sữa của bác nông dân nào là 300 giây (từ thời
điểm 1200 đến 1500; chú ý rằng ta chỉ tính giữa các thời điểm bắt đầu và kết
thúc của tất cả các sự vắt sữa, không tính khoảng thời gian từ 5 giờ đến thời
điểm vắt sữa sớm nhất và khoảng thời gian sau thời điểm vắt sữa muộn nhất).
Nhiệm vụ của bạn là viết một chương trình đọc danh sách các thời điểm bắt đầu
và kết thúc của N bác nông dân vắt sữa N con bò và tính (theo giây):
+ Khoảng thời gian dài nhất mà có ít nhất một con bò được vắt sữa.
+ Khoảng thời gian dài nhất mà không có con bò nào được vắt sữa.
Kết quả: File ra gồm hai dòng:
Dòng thứ nhất chứa một số nguyên là khoảng thời gian liên tục dài nhất mà có
ít nhất một con bò được vắt sữa;
Dòng thứ hai chứa một số nguyên là khoảng thời gian liên tục dài nhất mà
không có con bò nào được vắt sữa như mô tả ở trên.
Ví dụ: Milk.inp Milk.out
3 Thoi gian lien tuc: 900
300 1000 Thoi gian ranh: 300
700 1200
1500 2100
Giải thích:
Thời gian liên tục: 700 bé hơn các
khoảng thời gian bắt đầu trước nó:
Thời gian rảnh: 1500 lớn hơn tất cả
khoảng thời gian hoàn thành trước nó;

program Milk;
uses crt;
var i,n,max,s,kt,j,d:longint; t1,t2:longint; f:text;
a,b:array[1..1000] of longint;
begin clrscr;
assign(f,'milk.inp'); reset(f);
readln(f,n);
while not eof(f) do begin
inc(i);
while not eoln(f) do begin read(f,a[i]); break; end;
readln(f); end;
close(f);
assign(f,'milk.inp'); reset(f); i:=0; readln(f);
while not eof(f) do begin
inc(i);
while not eoln(f) do read(f,b[i]);
readln(f); end;
close(f);
for i:=2 to n do begin
for j:=1 to i do if a[i]<b[j] then begin
s:=b[i]-a[j]; s:=abs(s); if max<s then max:=s; end;
end;
assign(f,'milk.out'); rewrite(f);
writeln(f,max); max:=0; s:=0;
for i:=2 to n do begin
for j:=1 to i do if a[i]>b[j] then inc(kt);
if kt=i-1 then begin s:=a[i]-b[i-1]; s:=abs(s); if
max<s then max:=s; end; {Tìm thời gian rảnh lâu nhất}
kt:=0; end;
write(f,max);
close(F);
readln end.

Bài 34. Dùng các phép toán +/ - /*/ : để điền vào biểu thức dưới đây sao cho kết
quả bằng 35.
((((1 ? 2)? 3)? 4)? 5)? 6
program diendau;
uses crt;
var so1,so2,i1,j1,y,i11,x,i,n,j,d,kt,k:longint;
f,c,f1,a,a1:array[0..1000] of longint; l:byte;
t:array[0..1000] of boolean; ss:array[0..10000] of
string; s,s1,s2:string[255];
procedure incauhinh1;
begin
s1:=''; s2:=''; s:=''; kt:=0; so1:=0;
so2:=0;
for i1:=1 to x do begin d:=a1[i1];
f1[i]:=f[d]; end;
so1:=so1+100*f1[1]+10*f1[2]+f1[3];
str(so1,s1);
so2:=so2+100*f1[4]+10*f1[5]+f1[6];
str(so2,s2); s:=s1+s2;
if so1*2=so2 then writeln(so1,' ',so2);
end;
procedure try1(i1:longint);
var j1:integer;
begin
for j1:=1 to x do if t[j1] then begin
a1[i1]:=j1;
if i1=x then incauhinh1 else begin
t[j1]:=false; try1(i1+1); t[j1]:=true; end;
end;
end;
procedure incauhinh;
begin

x:=0;
for i:=1 to k do begin d:=a[1]; inc(X);
f[x]:=c[d]; end;
fillchar(t,sizeof(t),true); i1:=0; d:=0;
try1(1);
end;
procedure try(i:longint);
var j:integer;
begin
for j:=a[i-1]+1 to n-k+i do begin
a[i]:=j;
if i=k then incauhinh else try(i+1); end;
end;
begin clrscr;
for i:=1to 3 do c[i]:=1;
for i:=4 to 6 do c[i]:=2;
for i:=7 to 9 do c[i]:=3; for i:=10 to 12 do
c[i]:=4;
for i:=13 to 15 do c[i]:=5; for i:=16 to 18 do
c[i]:=6;
for i:=19 to 21 do c[i]:=7; for i:=22 to 24 do
c[i]:=8;
for i:=25 to 27 do c[i]:=9; n:=27; k:=6;
try(1);
readln end.

Bài 35. Nhập vào một mảng hai chiều gồm các số 0 và 1. Trong đó, số 1 biểu thị
một đoạn thẳng. Hãy viết chương trình đếm số số hình chữ được tạo thành
trong mảng đó (các hình chữ nhật không được chồng lên nhau)
Ví dụ:
OVUONG.INP OVUONG.OUT
010110 3
010110
000000
111111
111111

program ovuong;
uses crt;
var
cot,dong,i1,i,n,j1,j,cotd,cotc,dongd,d,dongc:longint;
a:array[0..100,0..100] of longint; kt:longint; f:text;
procedure xacdinh;
begin
for i:=1 to dong do
for j:=1 to cot do begin
if a[i,j]=1 then begin
dongd:=i; cotd:=j;
for i1:=i to dong do if (a[i1,cotd]=1) and
(a[i1+1,cotd]=0) then begin dongc:=i1; break; end;
for i1:=j to cot do if (a[dongd,i1]=1) and
(a[dongd,i1+1]=0) then begin cotc:=i1; break; end;
for i1:=dongd to dongc do
for j1:=cotd to cotc do if a[i1,j1]=0 then inc(kt);
if (kt=0) and (a[dongd,cotd-1]=0) then inc(d);
end;
kt:=0; end;
end;
procedure docfile;
begin
assign(f,'ovuong.inp'); reset(f);
while not eof(f) do begin
inc(dong);
while not eoln(f) do begin inc(cot);
read(f,a[dong,cot]); end;
n:=cot; cot:=0; readln(f); end;
cot:=n; close(f);
end;
begin clrscr;
docfile;
xacdinh;
write(d);
readln end.

Bài 36. Nhập vào 2 mốc thời gian bất kì, (ngày đầu – tháng đầu – năm đầu) và
(ngày cuối- tháng cuôi – năm cuối). Tính số ngày hai mốc thời gian đó
Tính số ngày từ ngày đầu – tháng đầu đến tháng 12 năm đầu
Tính số ngày từ ngày 1 – tháng 1 đến ngày cuối, tháng cuối của năm cuối
Tính tổng số ngày của các năm nằm giữa hai năm đầu và năm cuối
Cộng tất cả kết quả với nhau, ta được số ngày
program tinhngay;
uses crt;
var
i,n,j,ngaydau,thangdau,namdau,ngaycuoi,thangcuoi,namcu
oi,s1,s2,kt,s:longint;
begin clrscr;
write('NHAP MOCS THOI GIAN DAU ');
readln(ngaydau,thangdau,namdau);
write('NHAP MOC THOI GIAN CUOI ');
readln(ngaycuoi,thangcuoi,namcuoi);
for i:=thangdau+1 to 12 do begin
if (i=1) or (i=3) or (i=5) or (i=7) or (i=8) or (i=10)
or (i=12) then s1:=s1+31;
if (i=4) or (i=6) or (i=9) or (i=11) then s1:=s1+30;
if i=2 then if (namdau mod 4=0) or (namdau mod 400=0)
then s1:=s1+29 else s1:=s1+28;
end;
case thangdau of
1: s1:=s1+31-ngaydau;
2: if (namdau mod 400=0) or (namdau mod 4=0) then
s1:=s1+29-ngaydau else s1:=s1+28-ngaydau;
3: s1:=s1+31-ngaydau;
4: s1:=s1+30-ngaydau;
5: s1:=s1+31-ngaydau;
6: s1:=s1+30-ngaydau;
7: s1:=s1+31-ngaydau;
8: s1:=s1+31-ngaydau;
9: s1:=s1+30-ngaydau;
10: s1:=s1+31-ngaydau;
11: s1:=s1+30-ngaydau;
12: s1:=s1+31-ngaydau; end;
for i:=1 to thangcuoi-1 do begin
if (i=1) or (i=3) or (i=5) or (i=7) or (i=10) or (i=8)
or (i=12) then s2:=s2+31;
if (i=4) or (i=6) or (i=9) or (i=11) then s2:=s2+30;
if i=2 then if (namcuoi mod 4=0) or (namcuoi mod
400=0) then s2:=s2+29 else s2:=s2+28;
end;
s2:=s2+ngaycuoi;
for i:=namdau+1 to namcuoi-1 do if (i mod 400=0) or (i
mod 4=0) then s:=s+366 else s:=s+365;
s:=s+s1+s2; write(s);
readln end.

Bài 37. Mỗi chuỗi kí tự được gọi là đối xứng nếu nó có không ít hơn 1 kí tự
và nếu ta đọc từ phải sang trái hay từ trái sang phải đều giống nhau. Ví dụ:
&#39;Z&#39; , &#39;TOT&#39; , &#39;NAN&#39; là các chuỗi đối xứng còn
&#39;NAM&#39; không phải.
Yêu cầu:
Viết chương trình nhận vào chuỗi kí tự cho trước S và hãy cho biết có bao
nhiêu chuỗi con khác nhau của S là chuỗi đối xứng. Chuỗi con của S là chuỗi
gồm một số kí tự nằm liên tiếp nhau trong S.
Dữ liệu vào: Dữ liệu vào cho trong tập tin văn bản CHUOI.INP gồm nhiều
dòng,
mỗi dòng là một chuỗi kí tự cần xem xét (các chuỗi có độ dài không quá
80 kí tự).
Dữ liệu ra: Kết quả ghi trong tập tin văn bản CHUOI.OUT có số dòng bằng
với số dòng của CHUOI.INP. Mỗi dòng chứa một số nguyên là con số cho biết
số chuỗi con đối xứng của chuỗi ở dòng tương ứng trong CHUOI.INP.
program doixung;
uses crt;
var kt,i,n,i1,j,b,cuoi,d:longint; s:array[1..100] of
string; f:text;
s2,s3,s1:string[255];
begin clrscr;
assign(f,'doixung.inp'); reset(f);
while not eof(f) do begin
inc(n); read(f,s[n]); readln(f); end; close(f);
assign(f,'doixung.out'); rewrite(f);
for i:=1 to n do begin
s1:=s[i];
for i1:=1 to length(s1) do begin
for j:=i1-1 downto 1 do if s1[j]=s1[i1] then inc(kt);
if kt=0 then inc(d); kt:=0; end;
for i1:=1 to length(s1) do begin
cuoi:=length(s1);
while cuoi>i1 do begin
for j:=i1 to cuoi do s2:=s2+s1[j];
for j:=length(s2) downto 1 do s3:=s3+s2[j];
for j:=1 to length(s2) do if s2[j]=s3[j] then inc(kt);
if kt=length(s2) then inc(d);
kt:=0; dec(cuoi); s2:=''; s3:=''; end;
end;
writeln(f,d); d:=0; end;
close(f);
readln end.

Bài 38. Viết chương trình nhập vào một số la mã. Kiểm tra xem số la ma đó có
hợp lệ hay không
Cộng hai kí tự i và i+1 của chuỗi s, kiểm tra xem đó có phải là nhóm chữ số không,
nếu là nhóm chữ số → lưu vào mảng a sau đó cho hai kí tự đó thành kí tự trắng.
Nếu không kiểm tra và dịch kí tự s[i] sang số thập phân sau đó lưu vào mảng
Nếu mảng đã tạo trên là mảng tăng dần thì đó là số la mã ngược lại không
program lama;
uses crt;
var i,n,j,x,kt,tong,k1,k2,y,d,max:longint;
a,vt,b:array[1..1000] of longint; s,s2:string[255];
s1:string;
begin clrscr;
write('Nhap so ' ); readln(s);
{-----KIEM TRA QUI TAC LAP LAI CAC CHU SO------------}
for i:=1 to length(s) do begin
if (s[i]='I') and (s[i+1]='I') and (s[i+2]='I') and
(s[i+3]='I') then inc(kt);
if (s[i]='X') and (s[i+1]='X') and (s[i+2]='X') and
(s[i+3]='X') then inc(kt);
if (s[i]='C') and (s[i+1]='C') and (s[i+2]='C') and
(s[i+3]='C') then inc(kt);
if (s[i]='M') and (s[i+1]='M') and (s[i+2]='M') and
(s[i+3]='M') then inc(kt);
if (s[i]='V') and (s[i+1]='V') then inc(kt);
if (s[i]='L') and (s[i+1]='L') then inc(kt);
if (s[i]='D') and (s[i+1]='D') then inc(kt); end;
{--DICH CAC SO VA CHU SO LA MA SANG DAY THAP PHAN----}
for i:=1 to length(s) do begin
s1:=s[i]+s[i+1];
case s1 of
'IV':tong:=4;
'IX': tong:=9;
'XL': tong:=40;
'XC': tong:=90;
'CD': tong:=400;
'CM': tong:=900; end;
if tong<>0 then begin inc(X); b[x]:=tong; s[i]:=' ';
s[i+1]:=' '; end;
{------------KIEM TRA CAC NHOM CHU SO---------------}
if tong=0 then begin s1:=s[i];
case s1 of
'I': tong:=1;
'V': tong:=5;
'X': tong:=10;
'L': tong:=50;
'C': tong:=100;
'D': tong:=500;
'M': tong:=1000; end;
inc(x); b[x]:=tong; end;
tong:=0;
{------------KIEM TRA CAC CHU SO---------------------}
end; s1:=''; y:=0;
for i:=1 to x do if b[i]<>0 then begin inc(y);
a[y]:=b[i]; end;
for i:=1 to y do if a[i]>=a[i+1] then inc(d);
if (d=y) and (kt=0) then write('DUNG') else
write('SAI');
readln end.

Bài 39. Viết chương trình nhập vào một số tự nhiên, chuyển số đó thành số la
mã (n≤3000)
Tách hàng nghìn, hàng trăm, chục, đơn vị của số đó, chuyển lần lượt nghìn, trăm,
chục, đơn vị sang số la mã
Ví dụ: 1256 hàng nghìn 1, số la mã tương ứng 1000 là M
Hàng trăm là, số la mã ứng với 200 là CC
Hàng chục là 5, số la mã ứng với 50 và L
Hàng đơn vị là 6, số la mã ứng với 6 là VI
Nối M-CC-L-VI ta được số la mã tương ứng
program chuyendoilama;
uses crt;
var i,n,j,nghin,chuc,t,tram,dv,d:longint;
s:string[255]; s1,s2,s3,s4,s5:string[255];
procedure tachso;
begin
nghin:=n div 1000;
t:=n div 100; tram:=t mod 10;
dv:=n mod 10;
t:=n div 10; chuc:=t mod 10;
end;
procedure chuyendoi; begin
case nghin of
1: s1:='M'; 2: s1:='M'; 3: s1:='MMM'; end;
case tram of
1: s2:='C'; 2: s2:='CC'; 3: s2:='CCC'; 4:
s2:='CD'; 5: s2:='D';
6: s2:='DC'; 7: s2:='DCC'; 8: s2:='DCCC'; 9:
s2:='CM'; end;
case chuc of
1: s3:='X'; 2: s3:='XX'; 3: s3:='XXX'; 4:
s3:='XL'; 5: s3:='L';
6: s3:='LX'; 7: s3:='LXX'; 8: s3:='LXXX'; 9:
s3:='XC'; end;
case dv of
1: s4:='I'; 2: s4:='II'; 3: s4:='III'; 4:
s4:='IV'; 5: s4:='V';
6: s4:='VI'; 7: s4:='VII'; 8: s4:='VIII'; 9:
s4:='IX'; end;
s:=s1+s2+s3+s4; end;
begin clrscr;
write('Nhap n '); readln(n);
tachso; chuyendoi;
write(s);
readln end.

Bài 40. Viết chương trình nhập vào một số la mã, chuyển số đó sang số tự nhiên
program lama;
uses crt;
var i,n,j,b,c,d:longint; s,s1:string[255];
r,tong:integer; a:array[1..1000] of longint;
begin clrscr;
write('Nhap so '); readln(s);
for i:=1 to length(s) do begin
s1:=s1+s[i]+s[i+1];
case s1 of
'IX': tong:=9;
'IV': tong:=4;
'XL': tong:=40;
'CD': tong:=400;
'CM': tong:=900;
'XC': tong:=90; end;
if tong<>0 then begin inc(n); a[n]:=tong; s[i]:=' ';
s[i+1]:=' '; end;
if tong=0 then begin s1:=s[i];
case s1 of
'I': tong:=1;
'V': tong:=5;
'X': tong:=10;
'L': tong:=50;
'C': tong:=100;
'D': tong:=500;
'M': tong:=1000; end;
inc(n); a[n]:=tong; end;
tong:=0; s1:=''; end; tong:=0;
for i:=1 to n do tong:=tong+a[i]; write(tong);
readln end.

Bài 41. Trên một khu đất hình chữ nhật được chia thành từng thửa ruộng đều
nhau có cạnh là 1 để cho các tá điền thuê cày ruộng. Tại một số thửa ruộng, bạn
Bờm cho đào giếng để lấy nước tưới. Vì ănm nay trời hạn nên chỉ đủ nước tưới
cho các thửa ruộng xung quanh phạm v bán kính 2 ô vuông đơn vị. Các tá điền
không thể đưa nước đi xa vì họ không đủ sức cũng không có dụng cụ hỗ trợ. Em
hãy tính xem có bao nhiêu thửa ruộng không đủ nước tưới.
Dữ liệu vào: từ file văn bản FARM.inp gồm
+ Dòng 1: chứa 2 số nguyen m, n (m,n≤106) là chiều dài, rộng của khu đất
+ Dòng 2: chứa số nguyên k là số giếng bạn Bờm đã đào
+ Trong k dòng tiếp theo, mỗi dòng chứa 2 số nguyên là vị trí (dòng – cột) của
từng giếng
Dữ liệu ra: file văn bản FARM.out gồm 1 số nguyên duy nhất là số thủa ruộng
không đủ nước tưới
Ví dụ:
FARM.INP FARM.OUT
69 6
3
26
32
57
Cách làm:
Ví dụ: giếng 5 – 7
For dong≔5-2 to 5+2 do
For cot≔7-2 to 7+2 do a[dong,cot]≔1;
Program Farm;
uses crt;
var
i,n,j,cot,dong,d,i1,j1,cotd,dongd,cotc,dongc:longint;
a:array[-5..30,-5..30] of longint;
b,c:array[1..1000] of longint; f:text;
begin clrscr;
assign(f,'farm.inp'); reset(f);
read(f,dong,cot); readln(f); read(f,n); readln(f);
while not eof(f) do begin inc(i); read(f,b[i],c[i]);
readln(f); end; close(F);
assign(f,'farm.out'); rewrite(f);
for i:=1 to n do begin
dongd:=b[i]-2; dongc:=b[i]+2;
cotd:=c[i]-2; cotc:=c[i]+2;
for i1:=dongd to dongc do
for j1:=cotd to cotc do a[i1,j1]:=1;
end;
for i:=1 to dong do
for j:=1 to cot do if a[i,j]=0 then inc(d);
write(f,d); close(f);
readln end.

Bài 42. Kẹt xe do phương tiện cá nhân quá nhiều và ý thức tham gia chưa tốt là
một vấn nạn của các thành phố lớn tại Việt Nam. Để khuyến khích mọi người sử
dụng các phương tiện giao thông công cộng trong thành phố, ngoài việc bán rời
từng vé với giá p1, ta có cách bán cả tập k vé với giá p2 cho mỗi tập. Bờm dự
định đến thành phố tham quan và sẽ di chuyển n chuyến trên các phương tiện
giao thông công cộng. Vấn đề đặt ra là nên mua vé như thế nào để tiết kiệm tiền
nhất. Dĩ nhiên, Bờm sẽ không đi lậu vé
Yêu cầu: cho 4 số nguyên dương n, k, p1, p2. Nếu k=1 thì p1=p2. Hãy tính chi phí
tối thiểu cần thiết để mua vé
Dữ liệu vào: Vào từ tập tin BTICK.INP chứa 4 số nguyên n, k, p1, p2. Mỗi số cách
nhau một kí tự trắng
Dữ liệu ra: Ghi vào tập tin BTICK.OUT một số nguyên duy nhất là chi phí tối thiểu
mà Bờm phải bỏ ra
program btick;
uses crt;
var i,n,j,b,c,d,p1,p2,k:longint; f:text;
begin clrscr;
assign(f,'btick.inp'); reset(f); read(f,n,k,p1,p2);
close(f);
assign(f,'btick.out'); rewrite(f);
while n>=k do begin n:=n-k; d:=d+p2; end;
while n>=1 do begin dec(n); d:=d+p1; end;
write(f,d); close(f);
readln end.

Bài 43. Đỉnh đồi


Đồn điền trà của gia đình Tý nằm trên địa hình có nhiều ngọn đồi, để bảo vệ
đồn điền. Tý tính toán số người cần thiết để canh trên các đỉnh đồi này. Tý có
bản đồ của đồn điền là một ma trận gồm N hàng và M cột. Mỗi phân từ của
ma trận có độ cao H[i,j] so với mực nước biển là 0. Đỉnh đồi là 1 hoặc nhiều ô
nằm kề nhau của ma trận có độ cao bằng nhau và được bao quảnh bới các
đỉnh đồi nhỏ hơn. Hai ô gọi là kề nhau nếu chênh lệch giữa toạ độ x và y
không quá 1
Yêu cầu: Hãy giúp Tý xác định số lượng đỉnh đồi trên bản đồ
Dữ liệu vào: đọc từ văn bản TOP.INP
- Dòng đầu chứa hai số nguyên N, M cách nhau ít nhất một khoảng trắng
- N dòng tiếp theo, mỗi dòng là M số nguyên mô tả độ cao H[i,j] của ma
trận
Dữ liệu ra: Xuất ra tập tin TOP.OUT gồm 1 dòng duy nhất là số đỉnh đồi tìm
được.
Ví dụ:
TOP.INP TOP.OUT
87 3
4322101
3332101
2222100
2111100
1100010
0001110
0122110
0111210

program dinhdoi;
uses crt;
var
i,n,j,b,j1,cot,d,k,i1,dong,cotd,dem,dongd,cotc,dongc:l
ongint; kt,kt1,kt2,kt3,kt4:longint;
a:array[0..10,0..10] of longint; f:text;
procedure xacdinh;
begin
for i:=1 to dong do
for j:=1 to cot do begin
dongd:=i; cotd:=j;
for i1:=i to dong do begin
if a[i1,cotd]=a[i,j] then inc(kt); inc(d);
if (a[i1+1,cotd]<a[i,j]) and (kt=d) then begin
dongc:=i1; break; end;
end; kt:=0; d:=0;
for j1:=j to cot do begin
if a[i,j]=a[dongd,j1] then inc(kt); inc(d);
if (a[i,j]>a[dongd,j1+1]) and (kt=d) then begin
cotc:=j1; break; end;
end; kt:=0; d:=0;
for i1:=cotd to cotc do if a[dongd,i1]>a[dongd-1,i1]
then inc(kt1);
for i1:=dongd to dongc do if a[i1,cotd]>a[i1,cotd-1]
then inc(kt2);
for i1:=dongd to dongc do if a[i1,cotc]>a[i1,cotc+1]
then inc(kt3);
for i1:=cotd to cotc do if a[dongc,i1]>a[dongc+1,i1]
then inc(kt4);
if (kt1=cotc-cotd+1) and (kt4=kt1) and (kt2=dongc-
dongd+1) and (kt3=kt2) then
begin inc(kt); inc(dem); end;
if (a[i,j]=a[dongc+1,cotc+1]) and (kt=1) then inc(k);
kt1:=0; kt2:=0; kt3:=0; kt4:=0; kt:=0;
dongc:=0; cotc:=0; cotd:=0; dongd:=0; end;
end;
begin clrscr;
assign(f,'doi.inp'); reset(f);
readln(f);
while not eof(f) do begin
inc(dong);
while not eoln(f) do begin inc(cot);
read(f,a[dong,cot]); end;
n:=cot; cot:=0; readln(f); end;
cot:=n;
for i:=1 to dong do
for j:=1 to cot do begin write(a[i,j]); if j=cot then
writeln; end;
close(f); xacdinh; write(dem-k);
readln end.

Bài 44. Vay và trả


Có N khách để thuận tiên đánh số từ 1 đến N. Ngày kết thúc cuối cùng đã đến.
Bờm biết không thể trả khi không có đù tiền. Có tất cả N khách hàng xếp theo
một đường thẳng với khoảng cách 1 đơn vị. Bờm sẽ thu tiền người nợ và sẽ trả
cho người mình đang nợ khi số tiền đủ trả, không nhất thiết nhận hết rồi mới
trả nhưmg luôn về đích khi kết thúc. Khi cậu di chuyển tới, người nợ sẽ trả,
và khi cỏ đủ cậu sẽ trả cho các người mình nợ. Người thứ i nợ Bờm D, tiền.
Dấu trừ (-) có nghĩa là Bờm nợ tiền. Bờm bắt đầu ở vị tri 0 và phải kết thúc
chuyến đi ở vị trí người cuối cùng. Hãy tính quãng đường ngắn nhất mà cậu
ấy phải đi để thu tiền nợ và trả tất cả những người cậu ấy nợ? Trường hợp
không đủ tiến trả thì Bờm sẽ quay vị trí cuối và vẫn còn nợ.
Dữ liệu vào: Trong tập tin văn bản ZDIST.INP có cấu trúc:
- Dóng 1 là một số nguyên N (ISn S10);
-N dòng kế tiếp mỗi dòng chứa số nguyên D[i]
Kết quả: Ghi ra tập tin văn bản ZDIST.OUT có một số nguyên duy nhất là
quãng đường tối thiếu phải đi theo yêu cầu.
ZDIST.INP ZDIST.OUT
5 9
100
-200
250
-200
150

Program Zdist;
Uses crt;
Var i,n,j,b,c,d,s:longint; a:array[1..10000] of longint;
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔1 to n do begin write(i,’. ‘); readln(a[i]);
end;
For i≔1 to n do begin
Inc(d);
If a[i]>0 then begin s≔s+a[i]; a[i]≔0; end;
If (a[i]<0) and (s+a[i]>0) then begin s≔s+a[i];
a[i]≔0; end;
For j≔i downto 1 do if (a[j]<0) and (s+a[j]>0) then
begin
S≔s+a[j]; a[j]≔0; d≔d+i-j+1; end;
End;
Write(d);
Readln end.

Bài 45. Văn nghệ


Nhân dịp xuân về, đội văn nghệ của nhà văn hoá thiếu nhi được của đi biểu
diễn ở các phường trong thành phố. Đội văn nghệ có n bạn học sinh nam và m
bạn học sinh nữ được chia thành các tổ, mỗi tổ gồm số lượng học sinh nam và
nữ như nhau để phục vụ cho người dân ở các phường khác nhau. Biết rằng số
lượng học sinh nam và nữ phải được chia đều giữa các tổ và sau khi chia số
lượng học sinh nam và nữ phải bằng như giữa các tổ. Em hãy cho biết số tổ
văn nghệ nhiều nhất có thể chia là bao nhiêu?
Ví dụ: n=48 m = 72
→ số đội văn nghệ có thể chia là 24.
Số học sinh nam mỗi tổ: 2 Số học sinh nữ mỗi tổ: 3
Program vannghe;
Uses crt;
Var i,n,j,ucln,m,b,c,d:longint;
Begin clrscr;
Assign(f,’vannghe.inp’); reset(f); read(f,n,m);
Close(f);
Assign(f,’vannghe.out’); rewrite(f);
For i≔n downto 1 do if (n mod i=0) and (m mod i=0)
then begin ucln≔i; break; end;
Writeln(f,ucln); writeln(f,ucln div n);
Write(f,ucln div m); close(f);
Readln end.

Bài 46. Làng hoa


Dọc theo tuyến đường vào làng hoa Sa Đéc có n điểm tham quan được đánh số
từ 1 đến n theo hường từ đầu làng hoa đến cuối đường. Để phục vụ du khách,
ban quản đã trang bị các xe điện để đưa đón họ. Các xe điện được chia thành
hai tuyến. Tuyến 1 chạy từ đầu đường đến cuối đường và tuyến 2 chạy ngược
lại. Để tránh quá tải tại các điểm tham quan, mỗi tuyến xe điện chỉa dừng lại
tại một số điểm tham quan để đón trả khách
Yêu cầu: Có k khách di lịch hiện đang ở điểm tham quan số 1 và đã biết thông
tin về các điểm dừng đón trả khách của mỗi tuyến. Du khách thứ i muốn di
chuyển đến điểm tham quan si. Hãy cho biết mỗi du khách có thể di chuyển
đến điểm tham quan bằng xe điện hay bằng phương tiện khác
Dữ liệu vào: từ File văn bản LANGHOA.INP
+ Dòng thứ nhất ghi hai số nguyên dương n và k
+ Dòng thứ 2 ghi n số nguyên a1, a2,...an. Trong đó ai=1 nếu tuyến xe điện đó
có dừng lại đón trả khách tại điểm tham quan thứ i và bằng 0 nếu xe điện
không dừng lại
+ Dòng thứ 3 ghi n số nguyên b1, b2,...bn. Trong đó bi=1 nếu tuyến xe điện đó
có dừng lại đón trả khách tại điểm tham quan thứ i và bằng 0 nếu xe điện
không dừng lại
+ Dòng thứ 4 ghi k số nguyên dương là địa điểm mà vị khách thứ i muốn đến
tham quan
Dữ liệu ra: file văn bản LANGHOA.OUT gồm 1 dòng duy nhất ghi k số
nguyên trong đó số thứ i=1 nếu khách thứ i có thể đi bằng xe điện hoặc bằng 0
nếu họ không đi bằng xe điện
LANGHOA.INP LANGHOA.OUT
62 10
101101
110110
25

Giải thích: Khách thứ 1 có thể đến điểm tham quan 4 ở tuyến 1 và đổi xe sang
tuyến 2 có thể đến được điểm tham quan thứ 2.
Khách thứ 2 không thể dùng xe điện để đi đến điểm tham quan thứ 5
program langhoa;
uses crt;
var i,k,n,j,d:longint; b,c,a:array[1..1000] of
longint; f:text;
begin clrscr;
assign(f,'langhoa.inp'); reset(f); read(f,n,k);
readln(f);
while not eoln(f) do begin inc(i); read(f,a[i]); end;
i:=0; readln(f);
while not eoln(f) do begin inc(i); read(f,b[i]); end;
i:=0; readln(f);
while not eoln(f) do begin inc(i); read(f,c[i]); end;
close(f);
assign(f,'langhoa.out'); rewrite(f);
for i:=1 to k do begin
for j:=c[i] to n do if (a[j]=1) and (b[j]=1) and
(b[i]=1) then begin write(f,'1',' '); break; end;
end; close(f);
readln end.

Bài 47. Đoạn đường đẹp nhất


Trong thời gian vừa qua, người dân thành phố XYZ đã vui mừng chào đón sự
xuất hiện của con đường ven biển, con đường được đầu tư rất nhiều kinh phí
xây dựng và các toà nhà đẹp nằm cùng phía với con đường. Con đường có n
ngôi nhà, được đánh thứ tự từ 1 đến n, tính từ đầu đường, toà nhà thứ i có độ
cao là hi. Theo các chuyên gia kiến trúc và thẩm mĩ, đoạn đường đẹp nhất là
đoạn đường mà ở đó độ cao trung bình đúng bằng k
Yêu cầu: Hãy tìm đoạn đường có các toà nhà liên tiếp nhau nhiều nhất sao
cho đoạn đường này là đoạn đường đẹp nhất
Dữ liệu vào: từ tệp văn bản DDUONG.INP gồm
+ Dòng thứ nhất ghi 2 số nguyên dương n và k
+ Dòng thứ hai ghi n số nguyên dương hi là độ cao của từng ngôi nhà
Các số trên cùng dòng ghi cách nhau một dấu cách
Dữ liệu ra: Ghi vào tệp văn bản DDUONG.OUT gồm
+ Dòng thứ nhất ghi số nguyên u là chỉ số bắt đầu của toà nhà thuộc đoạn
đường đẹp nhất
+ Dòng thứ hai ghi số nguyên v là số ngôi nhà trong đoạn đường
DDUONG.INP DDUONG.OUT
45 2
2456 3

program dduong;
uses crt;
var cuoi,i,n,j,b,c,max,s,dau,d,k:longint;
a:array[1..1000] of longint; tb:real; f:text;
begin clrscr;
assign(f,'dduong.inp'); reset(f); read(f,n,k);
readln(f);
while not eoln(f) do begin inc(i); read(f,a[i]); end;
cuoi:=n; close(f);
assign(f,'dduong.out'); rewrite(f);
for i:=1 to n do begin
while cuoi>=i do begin
for j:=i to cuoi do s:=s+a[j];
tb:=s/(cuoi-i+1);
if (tb=k) and (max<cuoi-i+1) then begin dau:=i;
max:=cuoi-i+1; end;
tb:=0; s:=0; dec(cuoi); end;
cuoi:=n; end;
write(f,dau,' ',max); close(f);
readln end.

Bài 48. Viết chương trình tạo ra một ma trận cấp n (3n10), các phần tử là
các số tự nhiên ngẫu nhiên từ 0..99, sau đó sắp xếp theo thứ tự tăng dần theo
hình trôn ốc từ ngoài vào trong
Ví dụ:
123456789 123
894
765

program xoanoc;
uses crt;
var i,n,j,c,i1,d,x,t:longint; b:array[1..1000] of
longint;
a:array[1..100,1..100] of longint;
begin clrscr;
write('Nhap n '); readln(n); randomize;
for i:=1 to n*n do b[i]:=random(99);
for i:=1 to n*n-1 do
for j:=i to n*n do if b[i]>b[j] then begin t:=b[i];
b[i]:=b[j]; b[j]:=t; end;
writeln;
for i:=1 to n do begin inc(d); a[1,i]:=b[d]; end;
for i:=2 to n do begin inc(d); a[i,n]:=b[d]; end;
for i:=n-1 downto 1 do begin inc(d); a[n,i]:=b[d];
end;
for i:=n-1 downto 2 do begin inc(d); a[i,1]:=b[d];
end;
inc(d); x:=d;
for i:=1 to n-2 do begin
if (i mod 2<>0) then begin
for i1:=d to d+n-3-1 do
for j:=i1 to d+n-3 do if b[i1]>b[j] then begin
t:=b[i1]; b[i1]:=b[j]; b[j]:=t; end;
end;
if (i mod 2=0) then begin
for i1:=d to d+n-3-1 do
for j:=i1 to d+n-3 do if b[i1]<b[j] then begin
t:=b[i1]; b[i1]:=b[j]; b[j]:=t; end;
end;
d:=d+n-2; end; d:=x;
for i:=2 to n-1 do
for j:=2 to n-1 do begin a[i,j]:=b[d]; inc(d); end;
writeln;
for i:=1 to n do
for j:=1 to n do begin write(a[i,j],' '); if j=n then
writeln; end;
readln end.

Bài 49. Trăm trâu trăm cỏ


Trâu đứng ăn năm
Trâu nằm ăn ba
Lụ khụ trâu già
Ba con một bó
Yêu cầu: Em hãy lập trình giải bài toán trên
Program trau;
Uses crt;
Var i,n,j:longint; k:real;
Begin clrscr;
For i≔1 to 101 do begin
For j≔1 to 101 do begin
K≔100-i-j; if (k/3+5*i+3*j=100)then
Writeln(i,’ ‘,j,’ ‘,k:1:1); end;
End;
Readln end.

Bài 50. Xét tập các số F(N) (1≤ N ≤100 tấc cả các số hữu tỉ trong đoạn [0,1] có
mẫu số từ 1 đến N ta có
0 1 1 1 2 1 3 2 3 4 1
; ; ; ; ; ; ; ; ; ;
F(N) gồm có 1 5 4 3 5 2 5 3 4 5 1
Program fn;
Uses crt;
Var i,n,j,i1,x,kt,d:longint; kq:real;
a:array[1..10000] of real;
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
For i≔0 to n do begin
For j≔1 to n do begin
Kq≔i/j;
For i1≔1 to x do if a[i1]=kq then inc(kt);
If (kt=0) and (kq≥0) and (kq≤1) then begin inc(x);
a[x]≔kq; write(i,’-‘,j,’ ‘); end;
Kt≔0; end; end;
Readln end.

Bài 51. Cho biết một dãy các số chính phương viết liên tục 1491625....Nhập
vào số N hãy cho biết chữ số thứ N trong dãy.
ví dụ : N=5 kq là 6
N=6 kq là 2
Program chinhphuong;
Uses crt;
Var i,n,j,b,c,d:longint; s:string[255];
Begin clrscr;
Write(‘Nhap n ‘); readln(n);
While d<n do begin
Inc(i); b≔i*i; str(b,s);
For j≔1 to length(s) do begin inc(d); if d=n then
begin write(s[j],’ ‘); break; end; end;
End;
Readln end.

Bài 52. Chi phí cộng số


Nhập vào từ bàn phím số nguyên dương N ( 1<N<30) và N số nguyên dương
có gía trị nhỏ hơn 1000.

Xuất ra màn hình kết quả:

Dòng 1 ghi N số đã cho sau khi đã sắp xếp theo thứ tự giảm.

Dòng 2 ghi số T là tổng của N số đã cho

Dòng 3 ghi số thực R với hai chữ số sau dấu phẩy là chi phí nhỏ nhất khi thực
hiện các phép cộng để tính tổng T, biết rằng mỗi khi tính tổng của hai số
nguyên dương X và Y phải trả chi phí lượng tiền bằng 1% của tổng X + Y. Ví
dụ, khi tính tổng T của bốn số 35, 19,21,25 chi phí tối thiểu là R = 2,00

program chiphi;
uses crt;
var i,n,j,c,d:longint; chiphi:real; b,a:array[1..1000]
of longint;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin write(i,'. '); readln(a[i]);
end;
for i:=1 to n do b[i]:=a[i];
for i:=1 to n-1 do
for j:=i to n do if a[i]<a[j] then begin d:=a[i];
a[i]:=a[j]; a[j]:=d; end;
for i:=1 to n do write(a[i],' '); writeln; d:=0;
for i:=1 to n do d:=d+a[i];
writeln(d); d:=0;
for i:=1 to n do a[i]:=b[i];
for i:=1 to n do begin
d:=d+a[i]+a[i+1];
end;
d:=d-a[n]; d:=d+a[1]+a[n]; chiphi:=d/100;
write(chiphi:2:2);
readln end.

Bài 53. Gặp mặt


Một nhóm bạn gồm n học sinh đang tham gia một câu lạc bộ tin học trong dịp
nghỉ hè. Biết rằng khoảng thời gian có mặt tại câu lạc bộ là a[i],b[i] (trong đó:
a[i] là thời gian đến, b[i] là thời gian về) Cô giáo chủ nhiệm muốn đến thăm
các bạn trong câu lạc bộ này. Em hãy xác định thời điểm cô giáo đến sao cho
lúc đó cô có thể gặp được nhiều bạn nhất
Dữ liệu vào: vào từ file MEETING.INP gồm các dòng:
+ Dòng 1 chứa số nguyên dương n là số học sinh có mặt tại câu lạc bộ
+ Trong n dòng tiếp theo, mỗi dòng chứa 2 số nguyên dương a[i] và b[i] tương
ứng là thời gian đến và về của từng bạn. Các số trên cùng dòng ghi cách nhau
một dấu cách
Dữ liệu ra: file văn bản MEETING.OUT gồm 1 dóng chứa số nguyên k là số
học sinh nhiều nhất mà có giáo có thể gặp được
program meeting;
uses crt;
var i,n,j,c,max,d:longint; vt,b,kq,a:array[1..10000]
of longint;
begin clrscr;
write('Nhap n '); readln(n);
for i:=1 to n do begin write(i,'. ');
readln(a[i],b[i]); end;
for i:=1 to n do begin
for j:=1 to n do if (a[i]>=a[j]) and (a[i]<=b[j]) then
begin inc(d); vt[d]:=j; end;
if (max<d) then begin max:=d;
for j:=1 to max do kq[j]:=vt[j];
end;
d:=0; end;
for i:=1 to max do write(kq[i],' ');
readln end.

Bài 54. Tên thiêng


Thuở cưa, có một bộ tộc cổ đại giữ tập tục đặt tên cho những đứa con của
mình theo tên của vị thần năm đó với hi vọng chúng được thần linh phù hộ
hạnh phúc, khoẻ mạnh và có thể chống lại các thế lực đen tối, ma quỷ xung
quanh. Mỗi gia đình có một tên thiêng do trưởng làng lựa chọn. Tên các thành
viên trong gia đình phải là một xâu con gồm một hay nhiều kí tự liên tiếp
nhau của tên Thiêng (tên các thành viên không được trùng nhau và không
được trùng với tên Thiêng).
Ví dụ: với tên thiêng là alubala, các tên có thể đặt là: alu, uba, ala... các tên
không được đặt là aba, ala, ua...
Yêu cầu: Hãy nhập vào màn hình một tên Thiêng, hãy xuất ra số tên tối đa có
thể đặt từ tên Thiêng đó
aluba 23

program tenthieng;
uses crt;
var i,n,j,cuoi,d,kt,x:longint; s1:array[1..100] of
string; s2,s:string[255];
begin clrscr;
write('Nhap s '); readln(s); cuoi:=length(s);
for i:=1 to length(s) do begin
while cuoi>=i do begin
for j:=i to cuoi do s2:=s2+s[j];
for j:=1 to x do if s1[j]=s2 then inc(kt);
if kt=0 then begin inc(x); s1[x]:=s2; end;
kt:=0; s2:=''; dec(cuoi); end;
cuoi:=length(s); end;
write(x-1);
readln end.
Bài 55. Xếp gạch
Cường rất thích trò chơi xếp gạch. Cậu đặt các viên gạch chồng lên nhau và
xây thành nhiều chồng có độ cao khác nhau. Sau đó, cậu đem khoe với chị
Hoá: “Chị trông em đã xếp được một bức tường rồi này”. Nhưng chị bảo:
“Em phải xếp các chồng gạch cao đều nhau thì mưới gọi là bức tường được”.
Sau khi nghe vậy, Cường suy nghĩ một tí rồi thấy có ý đúng. Vì vậy, em bắt
đầu xếp lại các chồng gạch. Khi công việc đã hoàn tất, Cường mệt lả và muốn
có người nào đó giúp mình di chuyển số gạch với số thao tác ít nhất
Yêu cầu: Em hãy giúp Cường xác định số lần di chuyển gạch ít nhất mà bạn
ấy cần thực hiện
Dữ liệu vào: tệp văn bản GACH.INP gồm 2 dong:
+ Dòng 1: chứa số nguyên n là số các chồng gạch
+ Dòng 2: chức n số nguyên ai là độ cao của chồng gạch thứ i. Biết rằng tổng
số viên gạch chia hết cho n. Các số trên cùng dòng cách nhau một dấu cách
Dữ liệu ra: ghi vào tệp văn bản GACH.OUT gồm 1 số nguyên duy nhất là số
thao tác ít nhát mà Cường cần thực hiện
Ý tưởng: Tìm số viên gạch x mỗi chồng trong bức tường bằng cách lấy tổng chia
cho n. Sau đó tìm các số nhỏ hơn x trong mảng, nếu số đó nhỏ hơn x thì cộng số
chênh lệch cả hai.
GACH.INP GACH.OUT
6 5
524175

program gach;
uses crt;
var i,n,j,s,b,tam,c,d:longint; a:array[1..10000] of
longint; f:text;
begin clrscr;
assign(f,'gach.inp'); reset(f); read(f,n); readln(f);
while not eoln(f) do begin inc(i); read(f,a[i]); end;
close(f);
for i:=1 to n do s:=s+a[i];
tam:=s div n;
assign(f,'gach.out'); rewrite(f);
for i:=1 to n do begin
if a[i]<tam then d:=d+tam-a[i];
end;
write(f,d); close(f);
readln end.

Bài 56. Trong một bức thư Einstein gửi giáo sư Euler, ông ta nêu rằng mọi số
tự nhiên chẵn lớn hơn 2 đều có thể phân tích thành tổng của hai số nguyên tố
bất kì. Hãy viết chương trình kiểm nghiệm tính đúng đắn của phỏng đoán
trên.
Yêu cầu: nhập vào từ bàn phím số nguyên dương chẵn n (2<n<106). Xuất ra
mà hình cặp số nguyên tố có tổng bằng n.
program phongdoan;
uses crt;
var i,n,j,b,c,d,kt1,kt2,kt,so1,so2:longint;
begin clrscr;
write('Nhap n '); readln(n); so1:=n;
while kt=0 do begin
kt1:=0; kt2:=0; kt:=0;
dec(so1); so2:=n-so1;
for i:=1 to so1 do if so1 mod i=0 then inc(kt1);
for i:=1 to so2 do if so2 mod i=0 then inc(kt2);
if (kt1=2) and (kt2=2) then inc(kt);
end;
write(so1,' ',so2);
readln end.

Bài 57. Khi đào hầm Thủ Thiên, người ta co một robot đào hầm. Ban đầu,
người ta đào đường hầm dài 1 đơn vị độ dài sau đó đặt robot xuống. Robot
được điều khiển bởi 2 lệnh là: C1 và N2
+ C1: đào một đường hầm với độ dài 1 đơn vị, tiêu tốn 1 năng lượng
+ N2: đào một đường hầm bằng đúng độ dài đường hầm đang có, tốn 2 năng
lượng
Yêu cầu: Hãy viết chương trình yêu cầu robot đào một đường hầm với k đơn
vị độ dài và tiêu tốn ít năng lượng nhất có thể. Biết ban đầu đường hầm dài 1
đơn vị
Ví dụ:
12 12
C1 C1 N2 N2

Program robot;
Uses crt;
Var i,n,j,b,c,x,k:longint; s:array[1..10000] of
string;
Begin clrscr;
Write(‘Nhap k ‘); readln(k);
While k>2 do begin
If (k mod 2=0) then begin k≔k div 2; inc(x);
s[x]≔’N2’; end;
If (k mod 2<>0) then begin dec(k); inc(x); s[x]≔’C1’;
end;
End;
Inc(x); s[x]≔’C1’;
For i≔x downto 1 do write(s[i],’ ‘);
Readln end.

You might also like