You are on page 1of 38

BÀI TẬP 2

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.

You might also like