Professional Documents
Culture Documents
Bài 1: Hai số được gọi là giao nhau nếu có ít nhất một chữ số của số này có mặt trong
số kia và ngược lại. Các chữ số này được gọi là chữ số giao nhau của hai số.
Yêu cầu: Cho 2 số nguyên m và n. Hãy tìm các chữ số giao nhau của hai số đã cho.
Dữ liệu: Cho vào từ tệp văn bản sogiao.inp gồm 1 dòng ghi 2 số nguyên m và n cách
nhau một dấu cách (0<m<n<109)
Kết quả: Ghi ra tệp văn bản sogiao.out các chữ số giao nhau của hai số đã cho trên
cùng một dòng theo thứ tự từ nhỏ đến lớn. Giữa các số cách nhau một khoảng trắng.
Nếu hai số không giao nhau thì ghi -1
Ví dụ:
SOGIAO.INP SOGIAO.OUT SOGIAO.INP SOGIAO.OUT
1234 3456 34 123 789 -1
program giaonhau;
var st1,st2:string;
i,j,code,k,x,tam,l:integer;
a,b:longint;
m:array[1..100] of integer;
f,g:text;
procedure xoatrung(st:string);
begin
l:=length(st);i:=1;j:=1;
while i<l do
begin
j:=i+1;
repeat
if st[i]=st[j] then
begin
delete(st,j,1);
l:=length(st);
end
else inc(j);
until j>length(st);
i:=i+1;
end;
end;
begin
assign(f,'d:\SN.inp');
reset(f);
read(f,a,b);
str(a,st1);
str(b,st2);
assign(g,'d:\sogiao.out');
rewrite(g);
xoatrung(st1);xoatrung(st2);write(st1,#32,st2);
for i:=1 to length(st1) do
if pos(st1[i],st2)<>0 then
begin
val(st1[i],x,code);
k:=k+1;
m[k]:=x;
end;
for i:=1 to k-1 do
for j:=i+1 to k do
if m[i]>m[j] then
begin
tam:=m[i];
m[i]:=m[j];
m[j]:=tam;
end;
for i:=1 to k do write(g,m[i],#32);
close(f);
close(g); readln
end.
Bài 1: Hoán vị
Hai dãy số A và B được gọi là hoán vị của nhau nếu chúng có cùng một tập
phần tử và chỉ khác nhau về vị trí của các phần tử trong dãy.
Dữ liệu vào: Được ghi trên tệp Hoanvi.INP
- Hàng đầu tiên ghi 2 số nguyên dương n, m
- n hàng tiếp theo, mỗi hàng là một dãy số có m phần tử, các phần tử
cách nhau ít nhất một khoảng trắng.
Dữ liệu ra: Được ghi lên tệp Hoanvi.OUT là các cặp chỉ số của các dãy số là
hoán vị của nhau, ghi 0 nếu không có hoán vị nào.
Ví dụ:
Hoanvi.INP Hoanvi.OUT
45 12
12345 14
54321 24
56789
15342
program d;
uses crt;
var A,B : array[1..100,1..100] of integer ;
i,j,m,n : integer;
begin
clrscr;
write('Nhap vao so hang cua ma tran A: ');
readln(m,n);
for i := 1 to m do
for j := 1 to n do
begin
write('Nhap vao cac phan tu A[' ,i, ',' ,j, '] : ');
readln(A[i,j]);
end;
writeln('Ma tran : ');
for i := 1 to m do
begin
for j := 1 to n do
write(A[i,j]:6);
writeln;writeln;
end;
writeln('Ma tran chuyen vi : ');
for i := 1 to m do
for j := 1 to n do
B[j,i] := A[i,j];
for j := 1 to n do
begin
for i := 1 to m do
write(B[j,i]:6);
writeln;
writeln;
end;
readln;
end.
const fi='b1.inp'; fo='b1.out';
var f:text;
dd:array[1..21] of boolean;
x:array[1..21] of byte;
n:byte;
procedure inp;
begin
assign(f,fi);
reset(f);
readln(f,n);
close(f);
fillchar(dd,sizeof(dd),true);
end;
procedure pri1;
var i:byte;
begin
for i:=1 to n do write(f,x[i],' ');
writeln(f);
end;
procedure try(i:byte);
var j:byte;
begin
for j:=1 to n do if dd[j] then
begin
x[i]:=j;
dd[j]:=false;
if (i=n) then pri1 else try(i+1);
dd[j]:=true;
end;
end;
procedure pri;
begin
assign(f,fo);
rewrite(f); try(1);
close(f);
end;
begin
inp; pri; end.
Ví dụ:
Dondieu.INP Dondieu.OUT
37489121695 6
891216
end;
BÀI 4 : (5 điểm)
Palindrome là xâu ký tự mà nếu đọc nó từ trái sang phải cũng như từ phải sang trái ta
được cùng một xâu. Một xâu ký tự bất kỳ luôn có thể biểu diễn như là một dãy các
palindrome nếu như ta coi xâu chỉ gồm một ký tự luôn là palindrome.
Ví dụ: Xâu ‘bobseesanna’ có thể biểu diễn dưới dạng dãy các palindrome theo nhiều
cách, chẳng hạn
‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’
‘bobseesanna’ = ‘bob’ + ‘s’ + ‘ee’ + ’s’ + ‘anna’
‘bobseesanna’ = ‘b’ +’o’ + ‘b’ + ‘sees’ + ‘a’ + ‘n’ + ‘n’ + ‘a’
Yêu cầu: Cho xâu ký tự s, cần tìm cách biểu diễn xâu s dưới dạng một dãy gồm một
số ít nhất các palindrome.
Ví dụ: Cho s = ‘bobseesanna’, do ta có ‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’ và
không thể biểu diễn ‘bobseesanna’ bởi ít hơn là 3 palindrome nên biểu diễn này chính là
biểu diễn cần tìm.
Dữ liệu: Vào từ file văn bản PALINDR.INP gồm một dòng chứa xâu ký tự s gồm
không quá 255 ký tự.
Kết quả: Đưa ra màn hình đồng thời ghi vào file văn bản PALINDR.OUT:
- Dòng đầu tiên ghi k là số lượng ít nhất các palindrome trong biểu diễn tìm được;
- Dòng thứ i trong số k dòng tiếp theo ghi palindrome pi (i = 1, 2, ..., k) sao cho :
s = p1p2...pk.
Ví dụ
PALINDR.INP PALINDR.OUT PALINDR.INP PALINDR.OUT
bobseesanna 3 aabbaaaabb 2
bob aa
sees bbaaaabb
anna
DL.INP KQ.OUT
11121 2
6
Câu 3: (6.0 điểm) Khi đào hầm Thủ Thiêm người ta dùng một Robot để đào, ban đầu người
ta đào đường hầm 1 đơn vị độ dài sau đó đặt Robot xuống. Robot này được điều khiển bởi 2
lệnh là: C1 và N2.
- Lệnh C1 là đào thêm 1 đơn vị độ dài thì tốn 2 đơn vị năng lượng.
- Lệnh N2 là đào thêm một đoạn đường hầm bằng độ dài đang có thì tốn 4 đơn vị
năng lượng.
Hãy viết chương trình ra lệnh cho Robot đào một đường hầm có độ dài k đơn vị độ
dài với các lệnh là ít nhất và sự tiêu tốn năng lượng là thấp nhất. Biết ban đầu đường hầm
dài 1 đơn vị độ dài.
Yêu cầu:
- Dữ liệu vào trong tập tin Robot.inp gồm một số k là độ dài đường hầm cần đào.
- Dữ liệu ra trong tập tin Robot.out gồm hai dòng:
+ Dòng đầu là số năng lượng ít nhất đã tiêu tốn cho Robot đào hầm.
+ Dòng tiếp theo chứa các lệnh C1 hoặc N2, mỗi lệnh cách nhau 1 khoảng trắng.
Ví dụ:
Robot.inp Robot.out
10 12
C1 N2 C1
N2
PTHUONG.INP PTHUONG.OUT
5 23
6 1245
9
1
3
5
Hoặc
PTHUONG.INP PTHUONG.OUT
7 32
6 12467
9
1
3
5
10
4
Câu 1: ĐỘI ĐẶC NHIỆM (3 điểm)
Có không quá 1000 chiến sỹ công an tham gia chiến dịch truy quét tội phạm ở
tỉnh X. Các chiến sỹ công an được chia thành không quá 26 đội. Để dễ điều hành, bộ
chỉ huy chiến dịch kí hiệu cho mỗi đội là một chữ cái in thường nằm trong khoảng từ
‘a’ đến’z’. Hai đội khác nhau thì có kí hiệu khác nhau. Các chiến sỹ công an thuộc
đội nào thì được gắn một kí hiệu là kí hiệu của đội đó. Nếu lấy kí hiệu đã gắn cho tất
cả các chiến sĩ công an tham gia chiến dịch ghép lại với nhau thì được một xâu kí tự.
Yêu cầu: Hãy xác định số lượng các chiến sỹ công an trong mỗi đội.
Dữ liệu vào lấy từ văn bản file hsg1.inp gồm có 1 xâu S là ký hiệu của các
chiến sỹ công an tham gia chiến dịch.
Kết quả ghi vào file hsg1.out gồm có các đội và số thành viên của mỗi đội.
Ví dụ:
HSG1.INP HSG1.OUT
abcad a2
b1
c1
d1
Bài 2: (7 điểm)
Cho đa thức bậc n: A = anxn + an-1xn-1 +…+ a1x + a0
Trong đó an, an-1,…a1,a0 là các hệ số nguyên có giá trị tuyệt đối không quá 100.
Biết rằng phương trình A = 0 nếu có nghiệm nguyên thì nghiệm nguyên đó chỉ có thể là ước
số của hệ số a0.
Yêu cầu: Hãy tìm tất cả các nghiệm nguyên (nếu có) của phương trình A = 0.
Dữ liệu vào từ file ‘INTROOT.INP’:
Dòng đầu là số nguyên n (2≤n≤100)
Dòng thứ 2 ghi n+1 số nguyên tương ứng là các hệ số a n, an-1,…a1,a0 của đa thức (các số
cách nhau ít nhất một khoảng trắng).
Kết quả ghi vào file ‘INTROOT.OUT’ mỗi dòng ghi 1 nghiệm tìm được (nếu không có kết
quả thì ghi ‘khong co’).
Ví dụ:
INTROOT.INP INTROOT.OUT
4 -1
1 -1 0 -2 -4 2
(Giải thích: trong ví dụ trên thì phương trình x4-x3-2x-4=0 có 2 nghiệm nguyên là -1 và 2)
Hướng dẫn thêm: để tính biều thức A một cách hiệu quả nhất, người ta phân tích A thành
dạng như sau:
A = (…((anx + an-1)x + an-2)x + …)x +a1)x + a0
Program bai2;
Var i,n:shortint;f:text; a:array[0..100]of shortint;
Procedure Ini;
Begin
assign(f,'introot.inp');
reset(f);
readln(f,n);
For i:=n downto 0 do read(f,a[i]);
close(f);
assign(f,'introot.out');
rewrite(f);
end;
Function polynormial(x:integer):real;
Var i:shortint;y:real;
Begin
y:=a[n];
For i:=n-1 downto 0 do y:=y*x+a[i];
polynormial:=y;
End;
Procedure introot;
Begin
For i:=abs(a[0]) downto -abs(a[0]) do
if (i<>0) and(a[0] mod i = 0) then
if polynormial(i)=0 then writeln(f,i);
close(f);
end;
Begin
ini;
introot;
End.