Tải bản đầy đủ (.pdf) (17 trang)

150 Bài Toán Tin Đại học Sư Phạm Hà Nội 2004 – 2006 phần 5 pps

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (232.55 KB, 17 trang )



74

064. TRỌNG SỐ XÂU
Xét tập chữ cái A = {I, W, N}. Một từ là một dãy liên tiếp không quá 6 ký tự của A.
Cho một danh sách L gồm m từ phân biệt.
• Mỗi từ trong danh sách được gán một trọng số dương ≤ 60000.
• Những từ không có trong danh sách mang trọng số 0.

Xét một xâu S chỉ gồm các ký tự trong A. Trọng số của xâu S được tính bằng tổng trọng số các từ
trong S. (Các từ trong S được liệt kê dưới dạng các đoạn ký tự liên tiếp của S tính cả việc giao nhau
và chứa nhau)

Yêu cầu: Cho trước danh sách L và độ dài n

≤≤

100. Hãy tìm xâu S = S
1
S
2
S
n
có trọng số nhỏ
nhất. Nếu có nhiều xâu S đều có trọng số nhỏ nhất thì chỉ cần chỉ ra một xâu.

Dữ liệu: Vào từ file văn bản STR.INP
• Dòng 1: Ghi hai số n, m cách nhau một dấu cách.
• m cặp dòng tiếp theo, cặp dòng thứ i gồm 2 dòng:
♦ Dòng thứ nhất ghi từ thứ i trong danh sách L


♦ Dòng thứ hai ghi trọng số của từ đó

Kết quả: Ghi ra file văn bản STR.OUT gồm 2 dòng:
• Dòng 1: Ghi trọng số của từ S tìm được
• Dòng 2: Ghi xâu ký tự S

Ví dụ:

STR.INP STR.OUT STR.INP STR.OUT
8 10
I
13
W
6
N
12
II
6
NI
6
IIN
13
WWW
7
WNN
23
NWW
18
NWN
0


62
WWIWWIWW

8 8
W
10
I
10
N
30
WI
1
WW
10
II
11
WIW
2
IWI
3

98
IWIWIWIW




75


065. PHỐ MAY MẮN
Người dân thành phố Byteland có rất nhiều điều kiêng kỵ trong cuộc sống. Theo quan điểm của họ,
các số 2, 6, 13 và nhiều số khác không mang lại điều may mắn. Trong khi đó, các số 3, 5, 7 lại rất
được ưa chuộng. Những ngôi nhà có số mà khi phân tích ra thừa số nguyên tố chỉ chứa các thừa số
3, 5, 7 được coi là may mắn và được mua rất nhanh.
Sau một thời gian dài thảo luận, Hội đồng thành phố quyết định đánh số tất cả các ngôi nhà trên một
đường phố mới mở bằng các số may mắn liên tiếp nhau, biến phố đó thành một phố may mắn. Ký
hiệu dãy các số may mắn là X
1
, X
2
, X
3
, X
4
, Khi đó các nhà bên trái sẽ mang số X
1
, X
3
, X
5
. Còn
dãy nhà bên phải sẽ mang số X
2
, X
4
, X
6
, Toàn bộ đường phố có không quá 4000 nhà.


Hãy xác định xem một số cho trước có phải là một số nhà ở phố may mắn không. Nếu đúng thì
cho biết nhà đó nằm ở bên phải hay bên trái của phố.

Dữ liệu: Vào từ file văn bản STREET.INP gồm không quá 100000 dòng, mỗi dòng chứa một số
nguyên dương không quá 18 chữ số.

Kết quả: Ghi ra file văn bản STREET.OUT, gồm nhiều dòng, mỗi dòng tương ứng với một số ở
file dữ liệu vào và chứa một trong ba chữ cái L, R, N tương ứng với nhà bên trái, bên phải hay
không phải số nhà ở phố may mắn.

Lưu ý: Dãy số may mắn được tính bắt đầu từ X
1
=3.

Ví dụ:
STREET.INP STREET.OUT
5
3
4
98415
12814453125

R
L
N
R
L





76

066. TÍN HIỆU GIAO THÔNG
Trong một thành phố có:
• m đường phố (hai chiều) song song chạy thẳng dọc theo hướng Tây↔Đông, để tiện, ta gọi các
đường phố đó là H
1
, H
2
, , Hm theo thứ tự từ Bắc xuống Nam.
• n đường phố (hai chiều) song song chạy thẳng theo hướng Bắc↔Nam, ta gọi các đường phố đó
là V
1
, V
2
, , Vn theo thứ tự từ Tây sang Đông
Hai đường phố vuông góc bất kỳ cắt nhau tạo thành một nút giao thông. Ngoại trừ hai nút giao
thông nằm ở vị trí góc Đông-Nam và góc Tây-Bắc những nút giao thông khác có thể gắn đèn tín
hiệu giao thông hai trạng thái:
0. Trạng thái EW: Xanh hướng Đông và Tây, Đỏ hướng Bắc và Nam.
1. Trạng thái NS: Xanh hướng Bắc và Nam, Đỏ hướng Đông và Tây.
Mỗi đèn tín hiệu có một chu kỳ thời gian riêng, cứ sau mỗi chu kỳ thời gian đó, đèn đổi trạng thái
một lần. Tại thời điểm 0, các đèn tín hiệu đều ở trạng thái 0 (EW).
Để giữ an toàn, luật giao thông quy định: Khi xe tới một nút giao thông từ một hướng nào đó đúng
vào thời điểm đèn tín hiệu theo hướng đó đang Đỏ hay chuyển sang Đỏ thì buộc phải dừng lại, đúng
vào thời điểm đèn tín hiệu theo hướng đó đang Xanh hay chuyển sang Xanh thì có thể đi thẳng, rẽ
phải hay rẽ trái tuỳ ý.
Trên một đường phố, thời gian xe đi giữa hai nút giao thông liên tiếp cố định là 1 đơn vị thời gian.
Yêu cầu: Cho biết sơ đồ giao thông và các đèn tín hiệu. Cho một xe xuất phát tại thời điểm 0 từ

nút giao thông ở góc Tây-Bắc. Tìm hành trình và thời điểm sớm nhất để xe tới nút giao thông ở
góc Đông-Nam.

Dữ liệu: Vào từ file văn bản TRAFFIC.INP
• Dòng 1: Ghi hai số nguyên dương m, n (m, n ≤ 100)
• Dòng 2: Ghi số k là số đèn hiệu giao thông
• k dòng tiếp theo, dòng thứ i gồm 3 số nguyên dương x, y, t cho biết đèn hiệu thứ i nằm ở giao
điểm của đường Hx và Vy có chu kỳ là t (t ≤ 10000).

Kết quả: Ghi ra file văn bản TRAFFIC.OUT
• Dòng 1: Ghi thời điểm sớm nhất để xe chạy từ góc Tây-Bắc tới góc Đông-Nam
• Dòng 2: Ghi một dãy ký tự, ký tự thứ p ∈ {w, E, W, S, N} cho biết trong khoảng thời gian từ p-
1 tới p, xe trong trạng thái đứng đợi hay chạy theo hướng Đông, Tây, Nam hay Bắc (theo thứ tự
w, E, W, S, N đó).
Các số trên một dòng của Input File được ghi cách nhau ít nhất một dấu cách.

Ví dụ:

TRAFFIC.INP TRAFFIC.OUT
3 4
9
1 2 2
1 3 2
1 4 3
2 1 4
2 2 2
2 3 1
2 4 2
3 1 10
3 3 4


6
ESEwSE


2 2
3
4
2
1
2
10
4
w
W

E
N
S


77

067. PHÂN NHÓM
Cho n học sinh và m đặc điểm (n ≤ 100), (m ≤ 10).
Cần phân các học sinh này thành một số ít các nhóm nhất để đảm bảo rằng ta chỉ cần quan tâm
tới một số ít nhất các đặc điểm là có thể phân biệt được các học sinh trong nội bộ một nhóm.
Chú ý:
1. Trước tiên phải thoả mãn yêu cầu ít nhóm nhất, trong các cách chia ít nhóm nhất mà vẫn có
thể phân biệt được các học sinh trong một nhóm thì chỉ ra một cách chia phải dùng ít đặc

điểm nhất.
2. Tập các đặc điểm được chọn phải sử dụng được trên tất cả các nhóm để phân biệt học sinh.

Dữ liệu: Vào từ file văn bản GROUP.INP
• Dòng 1 ghi hai số n, m
• n dòng tiếp theo, dòng thứ i mô tả đặc điểm của học sinh thứ i: Gồm có m số nguyên mà số thứ j
là 1 hay 0 tuỳ theo học sinh thứ i có hay không có đặc điểm j.

Kết quả: Ghi ra file văn bản GROUP.OUT
Dòng 1: Ghi số k là số nhóm chia ra được
Dòng 2: Ghi các đặc điểm được chọn để phân biệt các học sinh trong nội bộ các nhóm
k dòng tiếp theo, dòng thứ p ghi các học sinh trong nhóm p

Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấu cách.

Ví dụ:

GROUP.INP GROUP.OUT GROUP.INP GROUP.OUT (Không tối ưu)
10 4
0 0 0 1
0 0 1 0
0 1 1 0
1 0 0 0
1 0 0 0
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 0
1 1 1 0


2
1 2 4
2 5 10 1 6
4 3 9 7 8


10 4
0 0 0 1
0 0 1 0
0 1 1 0
1 0 0 0
1 0 0 0
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 0
1 1 1 0

2
1 2 3 4
1 2 5 6 7 10
3 4 8 9



78

068. TUA DU LỊCH RẺ NHẤT
Một khu thắng cảnh gồm n điểm đánh số từ 1 tới n (n ≤ 100) và m đường đi hai chiều giữa các cặp
địa điểm đó, chi phí đi trên các đường đi là biết trước ( ≤ 10000).

Một Tour du lịch là một hành trình xuất phát từ một địa điểm đi thăm ≥ 2 địa điểm khác và quay trở
về điểm xuất phát, ngoại trừ địa điểm xuất phát, không địa điểm nào bị thăm tới hai lần. Chi phí của
một Tour du lịch là tổng chi phí các quãng đường đi qua.

Yêu cầu: Hãy tìm Tour du lịch có chi phí rẻ nhất.

Dữ liệu: Vào từ file văn bản TOUR.INP
• Dòng 1: Ghi hai số nguyên dương n, m
• m dòng tiếp theo mỗi dòng có dạng x y c. Cho biết có đường đi trực tiếp nối địa điểm x với địa
điểm y và chi phí đi quãng đường đó là c.

Kết quả: Ghi ra file văn bản TOUR.OUT
• Dòng 1: Ghi số 1 nếu như tồn tại hành trình theo yêu cầu, ghi số 0 nếu không tồn tại hành trình.
• Nếu dòng đầu tiên ghi số 1:
♦ Dòng thứ 2 ghi chi phí của tour tìm được
♦ Dòng thứ 3 ghi số k là số địa điểm tới thăm
♦ Dòng thứ 4 gồm k số, số thứ i là địa điểm tới thăm thứ i trong tour, quy ước địa điểm thăm
đầu tiên là địa điểm xuất phát, địa điểm thăm thứ k (địa điểm cuối cùng) là địa điểm mà từ đó
quay trở lại điểm xuất phát để kết thúc hành trình.

Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấu cách.

Ví dụ:
TOUR.INP TOUR.OUT
5 10
1 3 2
2 4 2
3 5 2
4 1 2
5 2 2

1 2 10
2 3 9
3 4 10
4 5 8
5 1 9

1
10
5
3 5 2 4 1

1
4 3
5 2
2
2
22
2
10
9
10
8
9




79

069. DU LỊCH NHIỀU TUA NHẤT

Một khu thắng cảnh gồm n điểm đánh số từ 1 tới n (n ≤ 200) và m đường đi hai chiều giữa các cặp
địa điểm đó.
Một Tour du lịch là một hành trình xuất phát từ một địa điểm đi thăm ≥ 2 địa điểm khác và quay trở
về điểm xuất phát, ngoại trừ địa điểm xuất phát, không địa điểm nào bị thăm tới hai lần.

Yêu cầu: Hãy tìm một số tour du lịch nhiều nhất sao cho mỗi tour du lịch tìm được đều có một
đoạn đường riêng hoàn toàn không có mặt trong các tua du lịch còn lại.

Dữ liệu: Vào từ file văn bản TOURS.INP
• Dòng 1: Ghi hai số n, m
• m dòng tiếp theo mỗi dòng có dạng x y cho biết giữa hai địa điểm x và y có đường đi trực tiếp.

Kết quả: Ghi ra file văn bản TOURS.OUT
• Dòng 1: Ghi số k là số tour du lịch tìm được
• k dòng tiếp theo, dòng thứ i mô tả tour du lịch thứ i: bắt đầu là số địa điểm thăm được trong
tour, tiếp theo là danh sách các địa điểm theo thứ tự trong hành trình bắt đầu từ địa điểm xuất
phát cho tới kết thúc là địa điểm mà từ đó quay lại điểm xuất phát để kết thúc hành trình

Các số trên một dòng của Input/Output file được ghi cách nhau ít nhất một dấu cách

Ví dụ:
TOURS.INP TOURS.OUT
5 10
1 3
2 4
3 5
4 1
5 2
1 2
2 3

3 4
4 5
5 1

6
3 3 2 1
4 4 3 2 1
3 4 3 2
5 5 4 3 2 1
4 5 4 3 2
3 5 4 3

1
4 3
5 2




80

070. PHÂN CÔNG
Có m thợ và n công việc, các thợ đánh số từ 1 tới m và các việc đánh số từ 1 tới n. Mỗi thợ có khả
năng thực hiện một số công việc nào đó.
Khi giao việc cho các thợ thực hiện, đối với một người thợ thì họ sẽ thực hiện các công việc được
giao một cách tuần tự và liên tục (sequence), làm mỗi việc mất một đơn vị thời gian. Nhưng đối với
nhiều thợ thì các công việc của họ được thực hiện song song (paralell), việc của ai người đấy làm,
không ảnh hưởng tới tiến độ của người khác.

Hãy tìm các phân công công việc cho các thợ để tất cả các công việc được thực hiện, mỗi việc chỉ

phân cho một thợ và thời gian hoàn thành tất cả các công việc là nhanh nhất.

Dữ liệu: Vào từ file văn bản ASSIGN.INP
• Dòng 1: Chứa hai số nguyên dương m và n (1 ≤ m ≤ 100; 1 ≤ n ≤ 500)
• m dòng tiếp theo, dòng i chứa danh sách các công việc mà thợ i có thể thực hiện, có thêm một
ký hiệu kết thúc là số 0.

Kết quả: Ghi ra file văn bản ASSIGN.OUT
• Dòng 1: Ghi từ YES hay NO tuỳ theo có tồn tại cách phân công để thực hiện tất cả các công
việc hay không.
• Nếu dòng 1 ghi từ YES:
♦ Dòng 2: Ghi thời gian nhanh nhất có thể để hoàn thành các công việc
♦ m dòng tiếp theo, dòng i ghi danh sách các công việc được phân cho thợ i, ghi thêm một ký
hiệu kết thúc là số 0.

Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấu cách

Ví dụ:
ASSIGN.INP ASSIGN.OUT
4 10
1 2 3 4 5 0
4 5 6 7 8 0
1 2 3 4 5 7 8 9 0
1 2 3 4 5 6 7 8 9 10 0

YES
3
3 4 5 0
6 7 8 0
2 9 0

1 10 0




81

071. NHẮN TIN
Một khoá học có n học viên đánh số từ 1 tới n, mỗi học viên có thể biết số điện thoại của một vài
học viên khác.
Học viên A có thể nhắn tin cho học viên B nếu như học viên A biết số điện thoại của học viên B.
Lưu ý rằng việc biết số điện thoại ở đây không phải quan hệ đối xứng: Có thể học viên A biết số
điện thoại của học viên B nhưng học viên B hoàn toàn không biết số điện thoại của học viên A.

Thầy giáo nắm được tất cả số điện thoại của các học viên trong hồ sơ của truờng, hỏi khi thầy
giáo muốn nhắn tin tới tất cả các học viên trong khoá, thầy giáo sẽ phải nhắn trực tiếp tới một số
ít nhất các học viên nào để thông điệp đó đến được tất cả các học viên khác.

Dữ liệu: Vào từ file văn bản MESSAGE.INP
• Dòng 1 chứa số n (n ≤ 700)
• Các dòng tiếp theo, mỗi dòng chứa hai số nguyên dương x, y (x ≠ y: 1 ≤ x, y ≤ n) cho ta thông
tin: học viên x biết số điện thoại của học viên y

Kết quả: Ghi ra file văn bản MESSAGE.OUT
• Dòng 1: Ghi số k là số học sinh được thầy giáo nhắn tin trực tiếp khi cần
• Dòng 2: Ghi k số hiệu của các học sinh được thầy giáo nhắn tin trực tiếp
Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấu cách.

Ví dụ:


MESSAGE.INP MESSAGE.OUT
12
1 3
3 6
6 1
6 8
8 12
12 9
9 6
2 4
4 5
5 2
4 6
7 10
10 11
11 7
10 9

2
7 2

1
3
6
8
12
9
2
4
5

7
10
11


Giới hạn không gian và thời gian: 512KB - 1 giây


82

072. CÁC SỐ ĐIỆN THOẠI
Ngày nay bạn phải nhớ quá nhiều số điện thoại mà chúng lại ngày càng dài hơn. Một trong những
cách để dễ ghi nhớ các con số như vậy là thay thế các chữ số bằng chữ cái theo một qui ước nào đó.
Ví dụ như ta có thể thay:
1 = ij 2 = abc 3 = def 4 = gh 5 = kl 6 = mn 7 = prs
8 = tuv 9 = wxy 0 = oqz
Bằng cách này, mỗi từ hoặc một nhóm từ có thể gán cho một số duy nhất, và vì thế bạn có thể nhớ
các từ thay vì các con số. Ví dụ số điện thoại của người bạn chơi cờ 941837296 thì có thể nhớ bởi
từ WHITE PAWN còn số điện thoại của một thầy giáo 8322437 thì có thể nhớ bằng từ TEACHER
thì dễ nhớ hơn nhiều so với các con số dài dòng đó.

Cho biết các phép thay thế số bằng chữ cái, và một từ điển. Hãy tìm một dãy gồm ít nhất các từ
để gán cho con số cần ghi nhớ cho trước. Mỗi từ có thể dùng nhiều lần.

Dữ liệu: Vào từ file văn bản PHONE.INP
• 10 dòng đầu tiên, dòng thứ i ghi danh sách các chữ cái có thể dùng để thay cho số i - 1.
• Dòng 11 ghi con số cần ghi nhớ (không quá 100 chữ số)
• Các dòng tiếp theo, mỗi dòng ghi một từ trong từ điển, mỗi từ gồm không quá 50 chữ cái tiếng
Anh in thường. Ký hiệu kết thúc từ điển là dòng cuối cùng ghi dấu #. Số từ trong từ điển không
quá 50000.

Trong Input File hoàn toàn không chứa dấu cách.

Kết quả: Ghi ra file văn bản PHONE.OUT
• Dòng thứ nhất: Ghi từ YES hay NO tuỳ theo có phép gán dãy từ cho số đã cho hay không ?
• Nếu dòng thứ nhất ghi từ YES, dòng thứ hai, ghi danh sách các từ để ghép lại theo đúng thứ tự
đó sẽ được số đã cho, các từ ghi cách nhau ít nhất một dấu trống.

Ví dụ:
PHONE.INP PHONE.OUT
oqz
ij
abc
def
gh
kl
mn
prs
tuv
wxy
7325189087
it
your
reality
real
our
#

YES
reality our





83

073. GIÁ TRỊ LỚN NHẤT
Một số nguyên dương x gọi là con của số nguyên dương y nếu ta có thể xoá bớt một số chữ số của y
để được x.

Cho hai số a và b hãy tìm số c là con của cả a và b sao cho giá trị của c là lớn nhất có thể.
Ràng buộc: 1≤ a, b ≤ 10
100
,
Dữ liệu vào luôn có nghiệm.

Dữ liệu: Vào từ file văn bản NUMBER.INP
• Dòng thứ nhất chứa số a
• Dòng thứ hai chứa số b

Kết quả: Ghi ra file văn bản NUMBER.OUT
• Ghi ra trên một dòng số c.

Ví dụ:

NUMBER.INP NUMBER.OUT NUMBER.INP NUMBER.OUT
123456781234
567812345678
56781234 2468013579
1234567890


24689




84

074. NÚT GIAO THÔNG TRỌNG ĐIỂM
Trong một đường phố có n nút giao thông và m đường hai chiều nối trực tiếp các cặp nút giao thông
đó, giữa hai nút giao thông bất kỳ có không quá một đường đi trực tiếp.
Một nút giao thông c được gọi là trọng điểm nếu tồn tại hai nút giao thông a và b (a, b, c đôi một
khác nhau) sao cho:
• Giữa a và b có ít nhất một đường đi theo các đường phố đã cho
• Nếu nút c bị tắc thì không có cách nào đi từ a sang b. Hay nói cách khác, mọi đường đi từ a tới b
chắc chắn phải qua c.
Cho biết sơ đồ giao thông của thành phố, hãy xác định các nút giao thông trọng điểm.

Dữ liệu: Vào từ file văn bản CNODE.INP
• Dòng 1: Ghi hai số nguyên dương n, m (n ≤ 1000; m ≤ 10000)
• m dòng tiếp theo, mỗi dòng ghi hai số nguyên dương u v, cho ta thông tin: Giữa hai nút giao
thông u và v có một đường đi trực tiếp.

Kết quả: Ghi ra file văn bản CNODE.OUT
• Dòng 1: Ghi số nút giao thông trọng điểm
• Dòng 2: Ghi chỉ số của các nút giao thông trọng điểm, các chỉ số này phải liệt kê đôi một khác
nhau.

Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấu cách

Ví dụ:


CNODE.INP CNODE.OUT

13 14
1 3
3 6
6 4
4 1
4 2
2 5
5 7
7 4
6 9
9 8
8 4
8 10
11 12
5 12

4
4 5 8 12

1
6
4
2
7
5
11
9 10

13
12
8
3




85

075. TẬP KẾT
Một bàn cờ kích thước nxn (2 ≤ n ≤ 100) trong đó đánh dấu một số ô cấm. Trên bàn cờ có k quân
mã đang đứng ở những vị trí nào đó (1 ≤ k ≤ 100). Cần đi những quân mã này đến k vị trí tập kết
(mỗi quân mã một vị trí). Trong quá trình di chuyển, mã không được nhảy đến các ô cấm nhưng có
thể nhảy đến ô đã có những quân mã khác đang đứng. Vai trò của các quân mã và các vị trí tập kết
là như nhau (một quân mã có thể cho đi tới bất kỳ vị trí tập kết nào nếu có đường nhảy). ở trạng thái
ban đầu k vị trí xuất phát và k vị trí tập kết được cho hoàn toàn phân biệt
Yêu cầu: Lập chương trình xác định cách đi các quân mã sao cho tổng số bước đi của các quân
mã là nhỏ nhất.
C

C

S

S

D



C


S

C


C

C

S

D

D

C

D


Dữ liệu: Vào từ file văn bản HORSES.INP
• Dòng 1: Ghi số n (n ≤ 100
• n dòng tiếp theo, dòng i, ghi n ký tự thể hiện hàng i của bàn cờ. Ký tự thứ i là:
♦ ".": Thể hiện ô trống
♦ "C": Thể hiện ô cấm
♦ "S": Thể hiện ô có mã đang đứng
♦ "D": Thể hiện ô ở vị trí tập kết


Kết quả: Ghi ra file văn bản HORSES.OUT
• Dòng 1: Ghi số m là tổng bước di chuyển để đưa các quân mã về vị trí tập kết. Nếu không có
cách tập kết thì ghi số -1.
• m dòng tiếp theo, dòng thứ i ghi 4 số x
1
y
1
x
2
y
2
cách nhau ít nhất một dấu cách, cho biết tại
bước thứ i sẽ di chuyển một quân mã từ ô (x
1
, y
1
) đến ô (x
2
, y
2
)

Ví dụ:
HORSES.INP HORSES.OUT
6
C.C S
SD.
C
SC

CC.SDD
C D

7
5 4 4 6
4 6 2 5
4 3 5 5
1 6 3 5
3 5 5 6
2 4 4 5
4 5 6 6



86

076. MỜI KHÁCH DỰ TIỆC
Công ty trách nhiệm hữu hạn "Vui vẻ" có n cán bộ đánh số từ 1 tới n. Cán bộ thứ i có đánh giá độ
vui tính là h
i
. Ngoại trừ giám đốc công ty, mỗi người đều có một thủ trưởng trực tiếp của mình.

Bạn cần giúp công ty mời một nhóm cán bộ đến dự dạ tiệc "Những người thích đùa" sao cho
tổng đánh giá độ vui tính của những người dự tiệc là lớn nhất, với yêu cầu: trong số những
người được mời không đồng thời có mặt nhân viên cùng thủ trưởng trực tiếp của người đó.

Dữ liệu: Vào từ file văn bản GUEST.INP
• Dòng đầu tiên ghi số cán bộ công ty: n (2 ≤ n ≤10000)
• n dòng tiếp theo, dòng thứ i gồm hai số tự nhiên b
i

, h
i
cho ta thông tin, người thứ i có thủ trưởng
trực tiếp là b
i
và độ vui tính là h
i
. Nếu như b
i
= 0 thì ta hiểu i là giám đốc công ty.

Kết quả: Ghi ra file văn bản GUEST.OUT
• Dòng 1: Ghi số người được mời (k) và tổng độ vui tính của những người đó (m)
• k dòng tiếp, mỗi dòng ghi số hiệu một người được mời tới dạ tiệc.

• Các số trên một dòng của Input/Output File được ghi cách nhau ít nhất một dấu cách
• Dữ liệu vào được cho đúng đắn: không tồn tại một dãy x
1
, x
2
, , xp, xp
+1
= x
1
mà người i là
thủ trưởng trực tiếp của người i + 1 (

∀∀

i: 1


≤≤

i

≤≤

p) .
• Không nhất thiết phải mời giám đốc công ty

Ví dụ:

GUEST.INP GUEST.OUT
10
2 9
3 7
4 8
0 10
4 2
5 11
6 6
6 4
4 6
9 6

4 36
1
4
6
10





87

077. KHÔI PHỤC NGOẶC
Một dãy dấu ngoặc hợp lệ là một dãy các ký tự "(" và ")" được định nghĩa như sau:
i. Dãy rỗng (không có ký tự nào) là một dãy dấu ngoặc hợp lệ
ii. Nếu A là một dãy dấu ngoặc hợp lệ thì (A) là dãy dấu ngoặc hợp lệ. Dấu ngoặc mở và dấu
ngoặc đóng hai bên dãy A được gọi là tương ứng với nhau
iii. Nếu A và B là hai dãy dấu ngoặc hợp lệ thì AB là dãy dấu ngoặc hợp lệ.

Ví dụ: ((()))(())()() là một dãy dấu ngoặc hợp lệ. các dấu mở ngoặc ở các vị trí: 1, 2, 3, 7, 8, 11, 13
tương ứng lần lượt với các dấu đóng ngoặc ở các vị trí: 6, 5, 4, 10, 9, 12, 14.

Ban đầu có một dãy dấu ngoặc hợp lệ, người ta viết vào dưới mỗi dấu ngoặc mở một số là số dấu
ngoặc (cả đóng và mở) nằm giữa dấu ngoặc mở đó và dấu ngoặc đóng tương ứng:

( ( ( ) ) ) ( ( ) ) ( ) ( )
4 2 0 2 0 0 0
Sau đó xoá đi dãy ngoặc.

Yêu cầu: Cho biết dãy số còn lại, hãy khôi phục lại dãy ngoặc ban đầu

Dữ liệu: Vào từ file văn bản BRACKETS.INP
• Dòng 1: Ghi số n là số phần tử của dãy số còn lại (n ≤ 10000)
• Dòng 2: Ghi lần lượt các số trong dãy

Kết quả: Ghi ra file văn bản BRACKETS.OUT

Gồm 1 dòng ghi dãy dấu ngoặc khôi phục được

Ví dụ:

BRACKETS.INP BRACKETS.OUT BRACKETS.INP BRACKETS.OUT
7
4 2 0 2 0 0 0

((()))(())()()

10
8 2 0 0 0 4 0 0 0 0

((())()())(()())()()




88

078. DÂY XÍCH
Một dây xích là một cây có tính chất: Tồn tại một đường đi sao cho mỗi đỉnh treo phải kề với đúng
một đỉnh trên đường đi đó. Với mỗi dây xích, đường đi này không nhất thiết phải duy nhất.
1 2 43
10
9
6
5
11
12

8
13
7

Cho một dây xích với các nút được đánh số 1 n (2

≤≤

n

≤≤

10000). Hãy tìm cách gán cho mỗi đỉnh
i một nhãn Lab(i); 1

≤≤

Lab(i)

≤≤

n sao cho các điều kiện sau được thoả mãn:
• Hai đỉnh khác nhau có hai nhãn khác nhau
• Không có hai cạnh nào có cùng giá trị tuyệt đối của hiệu các nút ở hai đầu mút
7 2 110
3
4
5
6
9

12
11
13
8

Dữ liệu: Vào từ file văn bản CHAIN.INP
• Dòng 1: ghi số n
• n - 1 dòng tiếp theo, mỗi dòng ghi hai đầu mút của một cạnh thuộc xích

Kết quả: Ghi ra file văn bản CHAIN.OUT (Nếu có nhiều lời giải thì chỉ cần chọn một)
• Một dòng n số, số thứ i là Lab(i)

Ví dụ:
CHAIN.INP CHAIN.OUT
13
1 2
1 5
1 6
1 9
1 10
2 7
2 11
2 3
3 4
4 8
4 12
4 13


7 2 10 1 6 5 8 11 4 3 9 12 13





89

079. PHÂN CÔNG
Có n thợ và n việc (n ≤ 200), các thợ được đánh số từ 1 tới n và các việc cũng được đánh số từ 1 tới
n. Với thợ i và việc j nào đó thì có hai khả năng: Hoặc thợ i không làm được việc j, hoặc làm được
với chi phí là c
ij
. (c
ij
là số tự nhiên ≤ 10
9
).

Hãy phân công cho mỗi thợ làm đúng một việc sao cho có thể thực hiện tất cả các công việc với
tổng chi phí ít nhất có thể.

Dữ liệu: Vào từ file văn bản ASSIGN.INP
• Dòng 1: Ghi số n
• Các dòng tiếp, mỗi dòng ghi ba số i j c
ij
cho ta thông tin: Thợ i làm được việc j với chi phí c
ij
.

Kết quả: Ghi ra file văn bản ASSIGN.OUT
• Dòng 1: Ghi tổng chi phí thực hiện các công việc, nếu không tồn tại cách phân công thì dòng

này ghi số -1.
• Nếu có phương án phân công, n dòng tiếp theo, dòng thứ i ghi số hiệu việc được phân cho thợ i.

Các số trên một dòng của Input File được ghi cách nhau ít nhất một dấu cách

Ví dụ:

ASSIGN.INP ASSIGN.OUT ASSIGN.INP ASSIGN.OUT
4
1 1 1
1 2 2
2 1 2
2 2 5
2 3 1
3 2 1
3 3 10
4 3 10
4 4 7

10
1
3
2
4

10
2 2 6
2 3 1
2 6 5
5 5 14

7 3 10
8 7 15
8 9 10

-1





90

080. DÂY CUNG
Trên mặt phẳng với hệ trục toạ độ Decattes vuông góc, cho đường tròn có tâm O là gốc toạ độ, bán
kính R. Trên đường tròn O xét n điểm xanh và n điểm đỏ đều có hoành độ nguyên, tung độ khác 0.
Các điểm được đánh số thứ tự từ 1 đến 2n và nằm ở các vị trí hoàn toàn phân biệt.
Theo giả thiết ở trên, thông tin về điểm thứ i có thể cho bởi bộ ba (C
i
, X
i
, D
i
) với:
• Ký tự C
i
∈ {R, B}; C
i
= R có nghĩa là điểm đỏ, C
i
= B có nghĩa là điểm xanh

• Số nguyên X
i
là hoành độ điểm đó.
• Số nguyên D
i
∈ {-1, 1}; D
i
= -1 tức là tung độ âm (nằm dưới trục hoành), D
i
= 1 tức là tung độ
dương (nằm trên trục hoành).
Dễ thấy cách xác định điểm nói trên là đúng đắn.

Yêu cầu: Hãy xác định n dây cung của đường tròn thoả mãn:
i. Mọi dây cung phải nối một điểm xanh với một điểm đỏ trong số các điểm kể trên
ii. Các dây cung đôi một không có điểm chung

Dữ liệu: Vào từ file văn bản CHORDS.INP
• Dòng 1: Ghi hai số nguyên dương n, R cách nhau một dấu cách (1 ≤ n ≤ 5000; 1 ≤ R ≤ 10001)
• 2n dòng tiếp theo, dòng thứ i chứa thông tin về điểm thứ i:
♦ Đầu dòng là ký tự C
i
.
♦ Tiếp theo là hoành độ X
i
(-R < X
i
< R)
♦ Tiếp theo là số nguyên Di
Ba thành phần này được ghi cách nhau đúng một dấu cách


Kết quả: Ghi ra file văn bản CHORDS.OUT
Gồm n dòng, mỗi dòng ghi chỉ số hai điểm tương ứng trên một dây cung.

Ví dụ:

CHORDS.INP CHORDS.OUT
4 3
B -1 1
R -1 -1
R 1 -1
B 0 1
R -2 -1
B 2 1
R 2 -1
B 0 -1

8 3
1 5
4 2
6 7

1
O(0,0)
2
3
4
5
6
7

8


×