You are on page 1of 44

Bài 1: HOHA - Số hoàn hảo

Số hoàn hảo là số có tổng các ước số bằng chính nó. Ví dụ 28 là số hoàn hảo (28 =
1+2+4+7+14).
Cho một số nguyên n, hãy kiểm tra xem n có phải là số hoàn hảo hay không.
Dữ liệu nhập:
- Là số nguyên n (2 ≤ n ≤ 107)
Dữ liệu xuất:
- Nếu n là số hoàn hảo in ra YES. Nếu không in ra NO.
Ví dụ
 input

28

output

YES

 input

14

output

NO

Uses crt;
Var n,k,i,t:longint;
Begin
Readln(n);
k:=trunc(sqrt(n));
t:=1;
For i:=2 to k do
If n mod i = 0 then t:=t+i+ n div i;
If k*k=n then t:=t-i;
If t=n then Write('YES') else
Write('NO');
Readln;
end.
Bài 2: TGVU - Tam giác vuông
Tuấn tham gia sinh hoạt Đội, cậu được phát một lá cờ semaphore, lá cờ có dạng là một tam giác
vuông cân. Với một số nguyên n, bạn hãy giúp Tuấn vẽ một tam giác vuông cân có cạnh góc
vuông là n.
Dữ liệu vào:
Là số nguyên n ( 1<= n <= 100).
Dữ liệu ra:
Là tam giác vuông cân gồm các dấu *, cạnh góc vuông có chiều dài n. Xem thêm ví dụ để
hiểu cách xuất dữ liệu.
Ví dụ
 input

output

*****
****
***
**
*

 input

output

**
*

Uses crt;
Var n,i,j:longint;
Begin
Readln(n);
For i:=n downto 1 do
Begin
If i<n then writeln;
For j:=1 to i do
write('*');
end;
Readln;
end.
Bài 3: USCLN - Ước số chung lớn nhất
Cho hai số nguyên dương a và b, hãy tìm ước số chung lớn nhất của a và b.
Dữ liệu nhập:
- Gồm 2 số a và b cách nhau một khoảng trắng (1 ≤ a, b ≤ 5.000.000)
Dữ liệu xuất:
- Là ước số chung lớn nhất của a và b.
Ví dụ
 input

6 9

output

 input

1 10

output

Uses crt;
var a,b,du:longint;
Begin
Readln(a,b);
If a mod b =0 then writeln(b)
else If b mod a = 0 then writeln(a)
else Begin
If b>a then
Begin
du:=a;a:=b;b:=du;
end;
While (a mod b <> 0) and (b<>1) do
Begin
du:=a mod b;
a:=b;
b:=du;
end;
Write(b);
end;
Readln;
End.
Bài 4: NGTO - Số nguyên tố
Số nguyên tố là số chia hết cho 1 và chính nó. Một số số nguyên tố đầu tiên là: 2, 3, 5, 7, 11,
13, 17 .... (số 1 không được xem là số nguyên tố).
Cho một số nguyên dương n, xác định xem n có phải là số nguyên tố hay không?
Dữ liệu vào:
- Là một số nguyên dương n (1<= n <= 1012). Chú ý dùng kiểu long long.
Dữ liệu xuất:
- Nếu n là số nguyên tố in ra "YES" (không in dấu nháy).
- Nếu n không phải là số nguyên tố in ra "NO" (không in dấu nháy).

Ví dụ
 input

output

YES

 input

output

NO

Uses crt;
Var n:int64;
Function Xuli(n:int64):boolean;
Var k,i:longint;
Begin
k:=trunc(sqrt(n));
If n<2 then exit(False);
If n<4 then exit(True);
For i:=2 to k do
If n mod i =0 then exit(False);
Exit(True);
end;
Begin
Readln(n);
If Xuli(n) then Write('YES') else Write('NO');
Readln;
End.
Bài 5: FIBO - Số fibonacy
Dãy số fibonacy được định nghĩa như sau:
f 1 = f2 = 1
fn = fn-1 + fn-2 (với n >= 3)
Bạn hãy viết chương trình in ra n số đầu tiên của dãy số fibonacy.
Dữ liệu nhập:
là số nguyên n (1<= n <= 30)
Dữ liệu xuất:
Là n số fibonacy đầu tiên trên cùng một dòng, mỗi số cách nhau một khoảng trắng.
Ví dụ
 input

output

1 1 2 3 5 8 13

 input

output

1 1 2 3 5

Uses crt;
Var n,i:byte;
M:Array [1..30] of longint;
begin
Readln(n);
M[1]:=1;M[2]:=1;
For i:=3 to n do
M[i]:=M[i-1]+M[i-2];
For i:=1 to n do
Write(M[i],' ');
Readln;
End.
Bài 6: VTAY - Vòng tay
Người con gái miền núi rất thích đeo vòng tay, bộ vòng tay thường có 7 chiếc dùng để đếm thời
gian. Cứ sau 01 ngày họ tháo chiếc vòng ở tay này đeo qua tay khác và sẽ di chuyển ngược lại
nếu như hết 01 tuần. Người con gái hẹn gặp lại người yêu sau n ngày. Hãy cho biết ở thời điểm
đó, số lượng vòng trên mỗi tay sẽ bằng bao nhiêu. Giả sử ban đầu cô gái đeo vòng tay bên trái.
Dữ liệu vào: là số nguyên dương n, dữ liệu vào đảm bảo 1 ≤ n ≤ 100.
Dữ liệu ra: gồm hai số nguyên ghi trên một dòng, cách nhau một khoảng trắng, cho biết số
vòng bên tay trái và số vòng bên tay phải tại ngày thứ n.

Ví dụ
 input

output

2 5

 input

12

output

5 2

 input
17

output

4 3

Uses crt;
Var b,n,a,t,p,i:byte;
Begin
Readln(n);
a:= n mod 7;
b:= n div 7;
If b mod 2 = 0 then t:=7;
If b mod 2 = 1 then p:=7;
If t=7 then
Write(t-a,' ',p+a);
If p=7 then
Write(t+a,' ',p-a);
Readln;
end.
Bài 7: GITHU - Tính giai thừa
Cho số nguyên n, hãy tính n!
Dữ liệu nhập:
- Là số nguyên n (1 ≤ n ≤ 17)
Dữ liệu xuất:
- Giá trị của n! . Chú ý rằng số này có thể rất lớn nên dùng kiểu long long.
Ví dụ
 input
1

output

 input

output

 input

output

var n,i:byte;t:int64;
Begin
Readln(n);
t:=1;
If n=0 then write(1) else
Begin
For i:=1 to n do
t:=t*i;
write(t);
end;
readln;
End.
Bài 8: SODEP - Số đẹp
Số tự nhiên N được gọi là số đẹp nếu cộng các chữ số của N lại ta có một số mà kết thúc bằng 9.
Ví dụ một số số đẹp là 18 (1+8=9), 234 (2+3+4=9), 658 (6+5+8=19). Cho một số N, hãy kiểm
tra xem N có phải là số đẹp hay không.
Dữ liệu nhập:
- Là số nguyên N (0 ≤ n ≤ 109)
Dữ liệu xuất:
- Nếu N là số đẹp, in ra "YES", nếu không in ra "NO"
Ví dụ
 input

27

output

YES

 input

658

output

YES

 input

111

output

NO

Var n:longint;
Function Tongcs(n:longint):byte;
Var t:integer;
Begin
t:=0;
While n>0 do
Begin
t:=t + n mod 10;
n:=n div 10;
end;
exit(t mod 10);
end;
Begin
Readln(n);
If tongcs(n)=9 then write('YES') else write('NO');
readln;
end.
Bài 9: BABE - Số bạn bè
Một cặp số nguyên dương được gọi là số bạn bè nếu tổng các ước số của số này bằng chính số
kia. Ví dụ 220 và 284 là cặp số bạn bè vì tổng các ước số của 220 là:
1+2+4+5+10+11+20+22+44+55+110=284 và tổng các ước số của 284 là
1+2+4+71+142=220. 1184 và 1210 cũng là hai số bạn bè. Hãy viết chương trình kiểm tra xem
2 số nhập vào có phải là số bạn bè hay không.
Dữ liệu nhập:
- Là hai số nguyên a, b cách nhau một khoảng trắng (1 ≤ a, b ≤ 10 5)
Dữ liệu xuất:
- In ra YES nếu a, b là hai số bạn bè. In ra NO nếu không phải.
Ví dụ
 input

220 284

output

YES

 input

12 20
output

NO

Uses crt;
Var a,b:longint;
Function Check(n:longint):longint;
Var t,i:longint;
BEgin
t:=0;
For i:=1 to trunc(Sqrt(n)) do
If n mod i = 0 then t:=t+i+n div i;
If sqr(Trunc(sqrt(n)))=n then t:=t-trunc(sqrt(n));
exit(t-n);
End;
Begin
Readln(a,b);
If (check(a)=b) and (check(b)=a) then write('YES') else Write('NO');
Readln;
End.
Bài 10: HIPHA - Hình phạt
Bạn Nam mất trật tự trong giờ học thể dục nên bị thầy giáo phạt. Hình phạt của thầy như sau:
bạn Nam đứng nghiêm, khi thầy hô "trái" thì Nam bước sang trái một mét, thầy hô "phải" thì
Nam bước sang phải một mét. Hỏi sau n lần thầy hô như vậy thì bạn Nam cách xa vị trí ban đầu
bao nhiêu mét?
Dữ liệu nhập:
- Dòng thứ nhất là số n (1 ≤ n ≤ 100).
- Dòng tiếp theo gồm n số 1 hoặc 2, mỗi số cách nhau một khoảng trắng. Nếu là số 1 thì thầy
giáo hô "trái", nếu là số 2 thì thầy giáo hô "phải".
Dữ liệu xuất:
- Là khoảng cách của Nam sau n lần hô so với vị trí ban đầu.

Ví dụ
 input

3
1 1 1

output

 input

4
1 1 2 1

output

 input

5
2 2 1 1 1

output

Uses crt;
Var n,t,i:longint;
M:Array [1..100000] of longint;
Begin
t:=0;
Readln(n);
For i:=1 to n do
Begin
Read(M[i]);
IF M[i]=1 then
t:=t-1
else t:=t+1;
end;
Write(abs(t));
Readln;
end.
Bài 11: GAGI - Gấp giấy
Thấy chân bàn bị gập ghềnh nên Nam lấy một tờ giấy lần lượt gấp đôi lại nhiều lần để kê chân
bàn. Giả sử tờ giấy có bề dày là a thì sau lần gấp đôi thứ nhất bề dày là 2a, sau lần gấp đôi thứ
2 là 4a, lần thứ 3 là 8a,.... Nếu khoảng gập ghềnh là b thì Nam cần gấp đôi giấy bao nhiêu lần
để kê chân bàn ít bị gập ghềnh nhất?
Dữ liệu nhập:
- Là hai số nguyên a, b cách nhau một khoảng trắng (1 ≤ a ≤ b ≤ 1.000)
Dữ liệu xuất:
- Là số nguyên xác định số lần gấp giấy.
Chú ý: Vì bàn khá nặng không khiêng được nên bề dày giấy gấp không được lớn hơn khoảng gập
ghềnh.
Ví dụ
 input

1 4

output

 input

2 5

output
1

Uses crt;
Var a,b,i:longint;
Begin
Readln(a,b);
i:=0;
While a<=b do
Begin
inc(i);
a:=A*2;
end;
Write(i-1);
Readln;
End.
Bài 12: MKC - Mật khẩu
Nam thường xuyên tham gia thi lập trình trên mạng. Vì đạt được thành tích cao nên Nam được
gửi tặng một phần mềm diệt virus. Nhà sản xuất phần mềm cung cấp cho Nam một mã số là
một số nguyên dương N có không quá 255 chữ số. Để cài đặt được phần mềm, Nam phải nhập
vào mật khẩu của phần mềm. Mật khẩu là một số nguyên dương M được tạo ra bằng cách tính
tổng giá trị các chữ số của N.
Yêu cầu: Hãy tìm số nguyên dương M.
Dữ liệu nhập:
- Ghi số nguyên dương N (1 ≤ N < 10255).
Dữ liệu xuất:
- Ghi số nguyên dương M tìm được.
Ví dụ
 input
84915388247

output

59

 input

145782417515245156498154841

output

117

Uses crt;
Var s:ansistring;
t,i:longint;
Begin
Readln(s);
t:=0;
For i:=1 to length(S) do
t:=t+ord(s[i])-ord('0');
Write(t);
Readln;
End.
Bài 13: CQUA - Chia quà
Nhân dịp đi du lịch, Nam đã mua n quả táo về làm quà cho hai người bạn thân là Tuấn và Sơn.
Mỗi quả táo có trọng lượng là 100g hoặc 200g. Bây giờ Nam muốn chia đều n quả táo trên thành
hai phần có trọng lượng bằng nhau để chia cho bạn. Khi mua thì Nam quên kiểm tra điều này.
Bạn hãy giúp Nam xem thử có thể chia n quả táo trên thành hai phần có trọng lượng bằng nhau
được không.
Dữ liệu vào:
- Dòng thứ nhất là số nguyên n (số lượng các quả táo), dữ liệu vào đảm bảo 1 ≤ n ≤ 100 .
- Dòng thứ hai gồm n số nguyên a1, a2, …, an là trọng lượng các quả táo mà Nam đã mua,
dữ liệu vào đảm bảo chỉ có hai trường hợp ai = 100 hoặc ai = 200.
Dữ liệu ra: nếu Nam có thể chia được thì in là YES, nếu không chia được thì in là NO.

Ví dụ
 input

3
100 200 100

output

YES

 input

4
100 100 100 200

output

NO

 input

4
100 200 200 100

output

YES

Giải thích:
 Test 1: Phần một gồm quả táo thứ 1 và quả táo thứ 3, phần 2 là quả táo thứ 2.
 Test 3: Phần một gồm quả táo thứ 1 và quả táo thứ 2, phần 2 là quả táo thứ 3 và thứ 4.

Uses crt;
Var n,i,t1,t2:longint;
m:Array [1..10000] of longint;
Begin
t1:=0;
t2:=0;
Readln(n);
For i:=1 to n do
Begin
Read(M[i]);
If M[i]=100 then inc(t1) else inc(t2);
end;
If (t1>0) and (t1 mod 2 = 0) then write('YES');
If (t1=0) and (t2 mod 2 = 0) then write('YES');
If (t1=0) and (t2 mod 2 =1 ) then write('NO');
If (t1>0) and ( t1 mod 2 =1 ) then write('NO');
readln;
ENd.
Bài 14: KUMAB - Khuyến mãi bia
Nhân dịp năm mới, hãng bia K có chương trình khuyến mãi cho khách hàng. Nội dung của
chương trình là nếu khách hàng đem đến cửa hàng 10 vỏ chai bia thì sẽ được nhận 03 chai bia
khuyến mãi. Vậy nếu ban đầu anh Bo mua n chai bia thì tổng cộng anh có thể uống được tất cả
bao nhiêu chai?
Dữ liệu nhập:
- Là số nguyên n (1 ≤ n ≤ 1.000) xác định số chai bia anh Bo mua ban đầu.
Dữ liệu xuất:
- Là số nguyên thể hiện tổng cộng số chai bia anh Bo có thể uống.
Ví dụ
 input

10

output

13

 input
24

output

33

Trong test 2: uống 20 chai đổi được thêm 6 chai+ 4 chai còn lại đổi thêm 3 chai nữa, tổng cộng
uống tất cả 33 chai.

Uses crt;
Var n,b,sl:longint;
Begin
Readln(n);
b:=0;
sl:=0;
While n>=10 do
Begin
b:=n div 10;
sl:=sl+b*10;
n:=n - b *10+b*3;
end;
sl:=sl+n;
Write(sl);
Readln;
end.
Bài 15: DABI - Số đặc biệt (OLPCĐ 2013)
Một số nguyên dương n được gọi là số đặc biệt nếu n chia hết cho tổng các chữ số của n. Ví dụ,
số 27 là số đặc biệt, còn hai số 11 và 2013 thì không phải là số đặc biệt.
Yêu cầu: Cho số nguyên dương n. Hãy kiểm tra xem số n có phải là số đặc biệt hay không?
Dữ liệu nhập:
- Là số nguyên dương n (1 ≤ n ≤ 1018)

Dữ liệu xuất:
- Nếu n là số đặc biệt in ra 1, nếu không phải in ra 0.
Ví dụ
 input

27

output

Uses crt;
Var n,i,a,b:int64;
Begin
Readln(n);
a:=n;
b:=0;
While a>0 do
BEgin
b:=b+a mod 10;
a:=a div 10;
end;
If n mod b = 0 then write(1) else write(0);
readln;
end.
Bài 16: GACHO - Gà và chó
Dân gian Việt Nam có một câu đố:
Vừa gà vừa chó
Bó lại cho tròn
Ba mươi sáu con
Một trăm chân chẵn
Sau khi giải được bài tập trên với số gà là 22 và số chó là 14, bạn Nam thắc mắc không biết
trong trường hợp tổng quát với n con (vừa gà vừa chó) và m chân thì sẽ giải như thế nào. Bạn
hãy giúp bạn Nam nhé.
Dữ liệu nhập:
- Là hai số nguyên n, m cách nhau một khoảng trắng (0 ≤ n, m ≤ 10 6)
Dữ liệu xuất:
- Nếu có đáp án, in ra hai số nguyên g và c thể hiện số gà và số chó, hai số cách nhau một
khoảng trắng.
- Nếu không có đáp án, in ra -1.
(Chú ý đáp án cho phép chỉ có gà hoặc chỉ có chó, không nhất thiết phải có cả hai con)
Ví dụ
 input

36 100

output

22 14

 input

10 10

output

-1

uses crt;
var a,b,c,g,x,y:longint;
Begin
Readln(a,b);
g:=0;
c:=0;
x:=a*4-b;
If x mod 2 = 0 then Begin
c:=x div 2;
g:=a-c;
If (c<0) or (g<0) then write(-1) else
Write(c,' ',g);
end
else Write(-1);
Readln;
ENd.
Bài 17 PALI - Số Palindrome
Một số nguyên dạng Palindrome là số mà đọc từ trái qua phải hay từ phải qua trái đều giống
nhau, ví dụ các số Palindrome: 101, 22, 123321.
Nhập vào một mảng n số nguyên a1, a2, ... an. Hãy in ra các số Palindrome theo đúng thứ tự
nhập.
Dữ liệu nhập:
- Dòng thứ nhất là chiều dài n của mảng (1<= n <= 1000)
- Dòng thứ hai gồm n số nguyên a1, a2, a3, ... an (0<= ai <= 109), mỗi số cách nhau một khoảng
trắng.
Dữ liệu xuất:
- Là một dòng duy nhất chứa các số nguyên Palindrome theo đúng thứ tự nhập, mỗi số cách
nhau một khoảng trắng.
Yêu cầu: không dùng các thao tác chuỗi để xử lý.
Ví dụ
 input

6
1 13 27 22 1221 556

output

1 22 1221
Uses crt;
Var n,i:longint;
M:Array [1..1000000] of longint;
Function Check(a:longint):boolean;
var i:longint; s:ansistring;
Begin
Str(a,s);
For i:=1 to length(s) do
If s[i]<>s[length(s)-i+1] then exit(False);
exit(True);
end;
Begin
Readln(n);
For i:=1 to n do
Read(M[i]);
For i:=1 to n do
If Check(M[i])=True then write(M[i],' ');
Readln;
end.
BÀi 18 BINA - Biễu diễn nhị phân
Cho một số nguyên dương n. Hãy in ra biễu diễn nhị phân của n.
Dữ liệu nhập:
- Là số nguyên dương n (0 ≤ n ≤ 109)
Dữ liệu xuất:
- Biểu diễn nhị phân của n.
Ví dụ
 input

29

output

11101

Uses crt;
Var n,i:longint;s:ansistring;
Begin
Readln(n);
s:='';
If n=0 then s:='0';
While n>0 do
BEgin
s:=chr(ord('0')+n mod 2)+s;
n:=n div 2;
end;
Write(s);
Readln;
End.
Bài 19: NUMFINAL - Chữ số tận cùng
Cho 2 số nguyên dương a và N (a<= 100; N<=106)
Tìm chữ số tận cùng của aN
+ input: 2 số a và N cách nhau 1 khoảng trắng.
+ output: 1 số duy nhất là kết quả tìm được

Ví dụ
 input

2 5

output

2 mũ 5 là 32, chữ số tận cùng của 32 là 2


Uses crt;
Var a,n,t,i:longint;
begin
Readln(a,n);
t:=1;
For i:=1 to n do
t:=(t*(a mod 10)) mod 10;
Write(t);
Readln;
End.
Bài 20: USCLN2 - Ước số chung lớn nhất 2
Cho hai số nguyên dương a và b, hãy tìm ước số chung lớn nhất của a và b.
Dữ liệu nhập:
- Gồm 2 số a và b cách nhau một khoảng trắng (1 ≤ a, b ≤ 1018)
Dữ liệu xuất:
- Là ước số chung lớn nhất của a và b.
Ví dụ
 input

6 9
output

 input

1 10

output

Uses crt;
Var a,b,i:int64;
Begin
Readln(a,b);
While a mod b <> 0 do
Begin
i:=a mod b;
a:=b;
b:=i;
end;
Write(b);
readln;
End.
Bài 21:COVUA - Bàn cờ vua
Bàn cờ vua là một hình vuông gồm n x n ô. Để dễ dàng cho các đấu thủ trong việc chơi cờ. Người
ta tô màu ô đen xen kẽ với ô trắng.
Yêu cầu: cho số nguyên n, hãy vẽ bàn cờ vua kích thước n x n. Biết rằng ô đầu tiên ở góc trên
bên trái là ô trắng.
Dữ liệu nhập:
- Là số nguyên n ( 1 ≤ n ≤ 100)
Dữ liệu xuất:
- Gồm n dòng, mỗi dòng gồm n ký tự B (màu đen) hay W (màu trắng)
Ví dụ
 input

output

WBWB
BWBW
WBWB
BWBW
 input

output

WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW
WBWBWBWB
BWBWBWBW

USes crt;
Var n,i,j:longint;
M:Array [1..10000,1..10000] of char;
Begin
Readln(n);
For i:=1 to n do
If i mod 2 =1 then
For j:=1 to n do
If j mod 2 = 1 then M[i,j]:='W' else M[i,j]:='B'
else
For j:=1 to n do
If j mod 2 = 0 then M[i,j]:='W' else M[i,j]:='B';
For i:=1 to n do
Begin
If i<>1 then writeln;
For j:=1 to n do
Write (M[i,j]);
end;
Readln;
End.
BÀi 22 Chialaydu - Chia lấy dư
Cho dãy số nguyên dương gồm N số và một số nguyên dương k.
A1, A2, … An
Bạn hãy lập trình đếm xem có bao nhiêu số dư khác nhau được tạo ra khi chia lần lượt các
phần tử trong dãy A cho K.
Input:
- Dòng đầu là hai số nguyên N, K (N, K<=10^5)
- Các dòng tiếp theo: dòng thứ i là số nguyên Ai (Ai <10^12)
Output:
- Gồm một số duy nhất là đáp án tìm được.
Ví dụ
 input

4 5
3 9 6 8

output

Uses crt;
Var n,i,k,dem:longint;
A,B:Array [0..10000009] of int64;
BEgin
Readln(n,k);
dem:=0;
Fillchar(B,sizeof(B),0);
For i:=1 to n do
Read(A[i]);
For i:=1 to n do
inc(B[A[i] mod k]);
For i:=0 to 1000000 do
If B[i]>0 then inc(Dem);
write(dem);
Readln;
End.
Bài 23: VASU - Vắt sữa bò
Vào một buổi sáng anh Bo sắp một đàn bò gồm n con bò để vắt sữa. Anh dự kiến là vào sáng
hôm đó, con bò thứ i có khả năng sẽ vắt được a i lít sữa. Tuy nhiên đàn bò của anh có đặc tính là
cứ mỗi lần vắt sữa một con, những con còn lại trông thấy sợ quá nên sẽ bị giảm sản lượng mỗi
con 01 lít sữa. Nếu vắt sữa con bò thứ nhất, n-1 con còn lại bị giảm sản lượng. Sau đó vắt sữa
con bò thứ hai thì n-2 con còn lại bị giảm sản lượng.... Bạn hãy giúp anh Bo tính xem thứ tự vắt
sữa bò như thế nào để số lượng sữa vắt được là nhiều nhất nhé.
Dữ liệu vào: gồm 2 dòng
- Dòng thứ nhất là số nguyên n (1 ≤ n ≤ 100) là số lượng con bò.
- Dòng thứ hai gồm n số nguyên a1, a2,..., an (1 ≤ ai ≤ 1000) là sản lượng sữa của các con bò.
Dữ liệu xuất:
- Là một số nguyên xác định số lít sữa nhiều nhất mà anh Bo có thể vắt được.
Ví dụ
 input

4
4 4 4 4

output

10

 input

4
2 1 4 3

output

- Trong test 1: vắt sữa con bò 1 (được 4), lượng sữa còn lại là 3 3 3; vắt sữa con bò 2 (được 3),
lượng sữa còn lại là 2 2, vắt sữa con bò 3 (được 2) và con bò 4 (được 1), tổng cộng 10.
- Trong test 2: vắt sữa con bò 1 (được 2), lượng sữa còn lại là 0 3 2; vắt sữa con bò 3 (được 3)
và vắt sữa con bò 4 (được 1) tổng cộng 6.

Uses crt;
Var n,i,t:longint;
M:Array [1..1000] of longint;
procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=M[(l+r) div 2];
repeat
while M[i]<x do
inc(i);
while x<M[j] do
dec(j);
if not(i>j) then
begin
y:=M[i];
M[i]:=M[j];
M[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort(l,j);
if i<r then
sort(i,r);
end;
Begin
clrscr;
Readln(n);
t:=0;
For i:=1 to n do
Read(M[i]);
sort(1,n);
For i:=n downto 1 do
If M[i]-n+i >=0 then
t:=t+M[i]-n+i;
Write(t);
Readln;
End.
BÀi 24 BINAS - Liệt kê chuỗi nhị phân
Hãy liệt kê tất các chuỗi nhị phân có chiều dài là n theo thứ tự từ điển. Hai chuỗi nhị phân chiều
dài n được gọi là khác nhau nếu tồn tại ít nhất một vị trí i (1 ≤ i ≤ n) mà có giá trị 0 ở chuỗi này
và có giá 1 ở chuỗi kia.
Dữ liệu nhập:.
- Là số nguyên n (1 ≤ n ≤ 20)
Dữ liệu xuất:
- Các chuỗi nhị phân chiều dài n theo thứ tự từ điển. Mỗi chuỗi trên một dòng (xem ví dụ)
Ví dụ
 input

output

00
01
10
11

 input

output

000
001
010
011
100
101
110
111

var a:array[1..100] of integer;


n:integer;
procedure print;
var k,ab:integer;
begin
ab:=0;
for k:=1 to n do BEgin
write(a[k]-1);
If a[k]=2 then inc(ab);
end;
If ab<>n then
writeln;
end;
procedure try(i:integer);
var j:integer;
begin
for j:=1 to 2 do
begin
a[i]:=j;
if i=n then print
else try(i+1);
end;
end;
begin
readln(n);
try(1);
readln
end.
BÀi 25: TILE - Chồng gạch
Nam có n viên gạch được đánh số từ 1 đến n. Các viên gạch có độ cứng lần lượt là a 1, a2,..., an.
Một viên gạch có độ cứng x nghĩa là Nam có thể chồng lên trên viên gạch đó tối đa x viên gạch
khác, nếu chồng nhiều hơn thì viên gạch đó bị vỡ. Hỏi Nam có thể sắp được chồng gạch cao nhất
là bao nhiêu?
Dữ liệu nhập:
- Dòng đầu tiên là số nguyên n (1 ≤ n ≤ 100) - là số viên gạch.
- Dòng tiếp theo gồm n số nguyên a1, a2,..., an (0 ≤ ai ≤ 100) mỗi số cách nhau một khoảng
trắng.
Dữ liệu xuất
- Là số nguyên xác định chiều cao cao nhất của chồng gạch mà Nam sắp được.
Ví dụ
 input

3
1 2 1

output

 input

6
0 0 0 0 0 0

output

Uses crt;
var n,i,dc,sl,g:longint;
A:Array [1..1000000] of longint;
procedure sort(l,r: longint);
var
i,j,x,y: longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do
inc(i);
while x<a[j] do
dec(j);
if not(i>j) then
begin
y:=a[i];
a[i]:=a[j];
a[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then
sort(l,j);
if i<r then
sort(i,r);
end;
BEgin
Readln(n);
For i:=1 to n do
Read(A[i]);
sort(1,n);
dc:=A[n];
g:=1;
While dc>0 do
Begin
If dc>A[n-g]+1 then dc:=A[n-g] else
dec(dc);
inc(g);
end;
Write(g);
Readln;
End.
BÀi 26: HOHA2 - Số hoàn hảo 2
Số hoàn hảo là số có tổng các ước số bằng chính nó. Ví dụ 28 là số hoàn hảo (28 =
1+2+4+7+14).
Cho một số nguyên n, hãy kiểm tra xem n có phải là số hoàn hảo hay không.
Dữ liệu nhập:
- Là số nguyên n (2 ≤ n ≤ 1012)
Dữ liệu xuất:
- Nếu n là số hoàn hảo in ra YES. Nếu không in ra NO.
Ví dụ
 input

28

output
YES

 input

14

output

NO

Uses crt;
Var n,t:int64;i,k:longint;
Begin
Readln(n);
k:=trunc(sqrt(n));
t:=1;
For i:=2 to k do
If n mod i = 0 then t:=t+i+ n div i;
If k*k=n then t:=t-i;
If t=n then Write('YES') else
Write('NO');
Readln;
end.
Bài 27: Khieuvu3 - Khiêu vũ 3
Câu chuyện tình yêu Elo Cruz và Mara ở Philippines là một minh chứng cho tình yêu đích thực,
không màng đến ngoại hình. Họ khiến cư dân mạng thế giới phải khâm phục vì một tình yêu bất
chấp những khác biệt về ngoại hình. Tuy nhiên admin rất lo lắng cho Elo, không biết anh chàng
này sẽ phải chọn chiếc ghế cao thế nào để hôn vợ. Cho nên trong buổi tiệc khiêu vũ “Cơn gió
đêm hè!” sắp đến đây admin muốn các cặp đôi có chiều cao chênh lệch phải đúng bằng K mới
được khiêu vũ cùng nhau.
Bạn hãy tính giúp cho admin xem có thể có bao nhiêu cách sắp xếp từng cặp đôi với nhau
thỏa mãn.
Input:
- Dòng đầu tiên là N - số lượng người tham gia bữa tiệc và số K (N≤10^5, K≤10^9)
- Các dòng tiếp theo là chiều cao của N người tham gia bữa tiệc – không có 2 người nào có chiều
cao giống nhau. (Hi ≤ 10^9)
Output:
- Gồm một số duy nhất là số cách lớn nhất có thể sắp xếp.

Ví dụ
 input

6 2
1 3 2 4 9 5

output

Uses crt;
var j,n,i,k,dem,l,r,mid:longint;
M:array [1..100000] of longint;
procedure sort(l,r: longint);
var i,j,x,y: longint;
begin i:=l; j:=r;
x:=M[(l+r) div 2];
repeat
while M[i]<x do inc(i);
while x<M[j]
do dec(j);
if not(i>j) then begin y:=M[i]; M[i]:=M[j]; M[j]:=y;
inc(i);
j:=j-1;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
dem:=0;
Readln(n,k);
For i:=1 to n do
Read(M[i]);
sort(1,n);
{========================================}
For j:=1 to n do
Begin
l:=1;
r:=n;
While l<=r do
Begin
mid:=(l+r) div 2;
if (M[mid]=M[j]+k) then
Begin
dem:=dem+1;
For i:=mid+1 to n do
Begin
If M[i]=M[j]+k then dem:=dem+1;
End;
For i:=1 to mid-1 do
Begin
If M[i]=M[j]+k then dem:=dem+1;
end;
break;
end;
If (M[mid]<M[j]+k) then l:=mid+1;
IF (M[mid]>M[j]+k) then r:=mid-1;
end;
end;
Write(dem);
Readln;
End.
Bài 28: DIKI - Sân điền kinh
Trong một sân điền kinh, người ta kẻ các vạch sơn để thi đấu các cự ly khác nhau. Có tất cả n
vạch sơn. Vạch sơn thứ i cách đầu sân khoảng cách là a i mét (a1 < a2 < a3 <...< an). Với một cự
ly chạy thi đấu là m mét, Ban tổ chức cần tìm 02 vạch sơn để thi đấu cự ly này. Nghĩa là tìm ra
vạch sơn xuất phát a i và vạch sơn kết thúc a j sao cho aj - ai = m. Bạn hãy giúp ban tổ chức tìm
ra hai vạch sơn này nhé.
Dữ liệu nhập:
- Dòng đầu tiên là hai số nguyên n và m cách nhau một khoảng trắng (1 ≤ n ≤ 10 5, 1 ≤ m ≤
109).
- Dòng thứ hai là n số nguyên a1, a2, a3,..., an, mỗi số cách nhau một khoảng trắng. (0 ≤ ai ≤
109). Dữ liệu đề bài cho đảm bảo a1 < a2 < a3 <...< an.
Dữ liệu xuất:
- Nếu có đáp án, in ra hai số x, y thể hiện hai vạch sân cần tìm (y - x = m). Nếu có nhiều đáp
án, có thể in ra đáp án bất kỳ.
- Nếu không có đáp án, in ra -1.
Ví dụ
 input

4 2
1 5 7 10

output

5 7

 input

4 3
1 5 7 10

output

7 10

 input

4 5
1 5 7 10

output

5 10

 input

4 2
1 4 7 10

output

-1
Uses crt;
var j,n,i,k,dem,l,r,mid:longint;
M:array [1..1000000] of longint;
begin
Readln(n,k);
For i:=1 to n do
Read(M[i]);
{========================================}
For j:=1 to n do
Begin
l:=1;
r:=n;
While l<=r do
Begin
mid:=(l+r) div 2;
if (M[mid]=M[j]+k) then
Begin
dem:=dem+1;
Writeln(M[j],' ',M[mid]);
break;
end;
If (M[mid]<M[j]+k) then l:=mid+1;
IF (M[mid]>M[j]+k) then r:=mid-1;
end;
end;
If dem=0 then write('-1');
Readln;
End.

You might also like