| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | IOI 2008 - Type Printer | 100 (p) | 1.0s | 64M |
| 2 | IOI 2008 - Islands | 100 (p) | 2.0s | 128M |
| 3 | IOI 2008 - Fish | 100 (p) | 3.0s | 64M |
Bạn cần in \(N\) từ bằng một chiếc máy in chữ rời. Đây là loại máy in cổ, trong đó người dùng xếp các miếng kim loại nhỏ, mỗi miếng mang một chữ cái, để tạo thành từ. Sau đó, một tờ giấy được ép lên các miếng kim loại để in từ đó. Chiếc máy của bạn cho phép thực hiện ba thao tác:
Ban đầu máy trống, không chứa miếng kim loại mang chữ cái nào. Khi in xong, bạn được phép để lại một số chữ cái trong máy. Bạn cũng có thể in các từ theo thứ tự tùy ý.
Mỗi thao tác đều tốn thời gian, nên bạn muốn thực hiện ít thao tác nhất có thể. Hãy tìm số thao tác ít nhất để in tất cả \(N\) từ đã cho, đồng thời đưa ra một dãy thao tác đạt được số lượng đó.
Đọc từ đầu vào chuẩn:
a đến z và có độ dài từ \(1\) đến \(20\), kể cả hai đầu mút. Các từ đôi một khác nhau.Ghi ra đầu ra chuẩn:
- (dấu trừ, mã ASCII \(45\)).P (chữ P viết hoa).Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.
Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.
Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.
| Nhãn nhóm | Điểm | Tệp dữ liệu vào gốc |
|---|---|---|
| 1 | 10 | typ/typ1a.in, typ/typ1b.in |
| 2 | 10 | typ/typ2apf.in, typ/typ2bpf.in |
| 3 | 10 | typ/typ3a.in, typ/typ3b.in |
| 4 | 10 | typ/typ4a.in, typ/typ4b.in |
| 5 | 10 | typ/typ5a.in, typ/typ5b.in |
| 6 | 10 | typ/typ6apf.in, typ/typ6bpf.in |
| 7 | 10 | typ/typ7a.in, typ/typ7b.in |
| 8 | 10 | typ/typ8apf.in, typ/typ8bpf.in |
| 9 | 10 | typ/typ9a.in, typ/typ9b.in, typ/typ9c.in |
| 10 | 10 | typ/typ10a.in, typ/typ10b.in, typ/typ10c.in, typ/typ10d.in |
Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.
Tệp ví dụ gốc: typ/typ0.in.
Ví dụ 1
3
print
the
poem
20
t
h
e
P
-
-
-
p
o
e
m
P
-
-
-
r
i
n
t
P
Bạn đang tham quan một công viên có \(N\) hòn đảo. Từ mỗi đảo \(i\), người ta đã xây đúng một cây cầu tới một đảo khác; độ dài của cây cầu đó được ký hiệu là \(L_i\). Như vậy, công viên có tổng cộng \(N\) cây cầu. Mặc dù mỗi cây cầu được xây từ một đảo tới một đảo khác, hiện nay tất cả các cây cầu đều có thể đi theo cả hai chiều. Ngoài ra, giữa mỗi cặp đảo có đúng một tuyến phà đi lại theo cả hai chiều.
Bạn thích đi bộ hơn đi phà, nên muốn tối đa hóa tổng độ dài các cây cầu đã đi qua, đồng thời tuân thủ những quy tắc sau:
Bạn không bắt buộc phải ghé thăm tất cả các đảo, và cũng có thể không đi qua được tất cả các cây cầu.
Cho thông tin về \(N\) cây cầu và độ dài của chúng, hãy tính tổng quãng đường đi bộ lớn nhất có thể đạt được khi tuân thủ các quy tắc trên.
Đọc từ đầu vào chuẩn:
Hai đầu của mỗi cây cầu luôn nằm trên hai đảo khác nhau. Có thể có hai cây cầu khác nhau nối cùng một cặp đảo.
Ghi ra đầu ra chuẩn một dòng chứa một số nguyên: tổng quãng đường đi bộ lớn nhất có thể đạt được.
Kết quả của một số bộ kiểm thử không biểu diễn được bằng số nguyên \(32\) bit. Để xử lý đầy đủ các trường hợp, có thể cần dùng int64 trong Pascal hoặc long long trong C/C++. Các giá trị đọc từ đầu vào đều nằm trong phạm vi số nguyên \(32\) bit.
Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.
Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.
Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.
Mỗi nhóm có trọng số 1. Có 19 nhóm tính điểm; điểm cuối cùng bằng \(100 \times W / 19\), với \(W\) là tổng trọng số các nhóm đạt. Mỗi nhóm đạt đóng góp chính xác \(100/19\) điểm; không làm tròn riêng từng nhóm.
| Nhãn nhóm | Điểm | Tệp dữ liệu vào gốc |
|---|---|---|
| 1 | \(100/19\) | isl/isl1.in |
| 2 | \(100/19\) | isl/isl2.in |
| 3 | \(100/19\) | isl/isl3.in |
| 4 | \(100/19\) | isl/isl4.in |
| 5 | \(100/19\) | isl/isl5.in |
| 6 | \(100/19\) | isl/isl6.in |
| 7 | \(100/19\) | isl/isl7.in |
| 8 | \(100/19\) | isl/isl8.in |
| 9 | \(100/19\) | isl/isl9.in |
| 10 | \(100/19\) | isl/isl10.in |
| 11 | \(100/19\) | isl/isl11.in |
| 12 | \(100/19\) | isl/isl12a.in, isl/isl12b.in |
| 13 | \(100/19\) | isl/isl13a.in, isl/isl13b.in |
| 14 | \(100/19\) | isl/isl14a.in, isl/isl14b.in, isl/isl14c.in, isl/isl14d.in |
| 15 | \(100/19\) | isl/isl15a.in, isl/isl15b.in |
| 16 | \(100/19\) | isl/isl16a.in, isl/isl16b.in, isl/isl16c.in |
| 17 | \(100/19\) | isl/isl17a.in, isl/isl17b.in, isl/isl17c.in, isl/isl17d.in |
| 18 | \(100/19\) | isl/isl18a.in, isl/isl18b.in, isl/isl18c.in, isl/isl18d.in, isl/isl18e.in, isl/isl18f.in, isl/isl18g.in |
| 19 | \(100/19\) | isl/isl19a.in, isl/isl19b.in, isl/isl19c.in, isl/isl19d.in, isl/isl19e.in, isl/isl19f.in, isl/isl19g.in |
Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.
Tệp ví dụ gốc: isl/isl0.in.
Ví dụ 1
7
3 8
7 2
4 2
1 4
1 9
3 4
2 3
24
\(N=7\) cây cầu trong ví dụ lần lượt nối các cặp đảo \((1,3)\), \((2,7)\), \((3,4)\), \((4,1)\), \((5,1)\), \((6,3)\) và \((7,2)\). Chú ý rằng có hai cây cầu khác nhau nối đảo \(2\) với đảo \(7\).
Một cách đạt tổng quãng đường đi bộ lớn nhất là:
Kết thúc chuyến đi, bạn ở đảo \(2\) và tổng quãng đường đã đi bộ là \(9+8+4+3=24\).
Đảo duy nhất chưa được ghé thăm là đảo \(4\). Tuy nhiên, khi chuyến đi trên kết thúc, bạn không thể ghé thăm đảo này nữa:
Scheherazade kể rằng ở một nơi xa xôi giữa sa mạc có một hồ nước. Ban đầu, hồ có \(F\) con cá. Người ta chọn ra \(K\) loại đá quý trong số những loại quý giá nhất trên Trái Đất và cho mỗi con cá nuốt đúng một viên đá quý. Vì \(K\) có thể nhỏ hơn \(F\), hai hoặc nhiều con cá có thể nuốt đá quý cùng loại.
Theo thời gian, một số con cá đã ăn những con cá khác. Một con cá có thể ăn một con khác khi và chỉ khi chiều dài của nó ít nhất gấp đôi chiều dài con kia: cá \(A\) có thể ăn cá \(B\) khi và chỉ khi \(L_A \ge 2L_B\). Không có quy định về thời điểm cá quyết định ăn. Một con cá có thể lần lượt ăn nhiều con cá nhỏ hơn, trong khi một số con có thể không ăn con nào dù có khả năng ăn. Khi một con cá ăn một con nhỏ hơn, chiều dài của nó không thay đổi, nhưng tất cả đá quý trong bụng con cá nhỏ hơn được chuyển nguyên vẹn vào bụng nó.
Scheherazade nói rằng nếu tìm được hồ, bạn sẽ được bắt đúng một con cá và giữ lại tất cả đá quý trong bụng nó. Bạn muốn thử vận may, nhưng trước khi lên đường, bạn muốn biết có bao nhiêu tổ hợp đá quý khác nhau có thể thu được khi bắt một con cá.
Cho chiều dài mỗi con cá và loại đá quý mà nó nuốt ban đầu, hãy tính số tổ hợp đá quý khác nhau có thể xuất hiện trong bụng một con cá bất kỳ, lấy phần dư khi chia cho số nguyên \(M\) đã cho. Một tổ hợp chỉ được xác định bởi số lượng đá quý thuộc từng loại trong \(K\) loại. Thứ tự các viên đá không có ý nghĩa, và hai viên đá cùng loại không thể phân biệt với nhau.
Đọc từ đầu vào chuẩn:
Dữ liệu bảo đảm ban đầu có ít nhất một viên đá quý thuộc mỗi loại trong \(K\) loại.
Ghi ra đầu ra chuẩn một dòng chứa một số nguyên trong đoạn \([0,M-1]\): phần dư khi chia số tổ hợp đá quý khác nhau có thể thu được cho \(M\).
Giá trị \(M\) chỉ được dùng để đơn giản hóa việc tính toán bằng cách lấy phần dư; nó không ảnh hưởng đến những tổ hợp nào có thể thu được.
Lưu ý: Cách chia nhóm và tính điểm dưới đây là bản điều chỉnh để luyện tập trên hệ thống, không khẳng định tương đương cách chấm tại IOI gốc.
Mỗi nhóm được chấm độc lập: chỉ nhận điểm của nhóm khi vượt qua tất cả bộ kiểm thử trong nhóm; nếu có bộ kiểm thử không đạt thì nhóm nhận 0 điểm. Tổng điểm tối đa là 100.
Nhãn nhóm là phần số trong tên tệp dữ liệu gốc. Tất cả tệp cùng nhãn, kể cả các hậu tố chữ và pf, đều thuộc nhóm đó.
| Nhãn nhóm | Điểm | Tệp dữ liệu vào gốc |
|---|---|---|
| 1 | 5 | fsh/fsh1apf.in |
| 2 | 5 | fsh/fsh2a.in |
| 3 | 5 | fsh/fsh3a.in |
| 4 | 5 | fsh/fsh4a.in |
| 5 | 5 | fsh/fsh5a.in, fsh/fsh5b.in |
| 6 | 5 | fsh/fsh6apf.in, fsh/fsh6bpf.in |
| 7 | 5 | fsh/fsh7a.in |
| 8 | 5 | fsh/fsh8a.in |
| 9 | 6 | fsh/fsh9a.in, fsh/fsh9b.in |
| 10 | 6 | fsh/fsh10a.in, fsh/fsh10b.in, fsh/fsh10c.in |
| 11 | 6 | fsh/fsh11apf.in, fsh/fsh11bpf.in, fsh/fsh11cpf.in |
| 12 | 6 | fsh/fsh12a.in, fsh/fsh12b.in |
| 13 | 6 | fsh/fsh13a.in, fsh/fsh13b.in |
| 14 | 5 | fsh/fsh14a.in |
| 15 | 5 | fsh/fsh15a.in |
| 16 | 5 | fsh/fsh16a.in, fsh/fsh16b.in |
| 17 | 5 | fsh/fsh17apf.in, fsh/fsh17bpf.in |
| 18 | 5 | fsh/fsh18a.in, fsh/fsh18b.in, fsh/fsh18c.in, fsh/fsh18d.in |
| 19 | 5 | fsh/fsh19a.in, fsh/fsh19b.in, fsh/fsh19c.in, fsh/fsh19d.in |
Các ví dụ trong đề không tính điểm. Các tệp ví dụ gốc có nhãn 0 được giữ lại riêng và có trọng số 0.
Tệp ví dụ gốc: fsh/fsh0.in.
Ví dụ 1
5
3
7
2 2
5 1
8 3
4 1
2 3
4
Có \(11\) tổ hợp có thể thu được, nên cần in \(11 \bmod 7=4\).
Các tổ hợp đó là \([1]\), \([1,2]\), \([1,2,3]\), \([1,2,3,3]\), \([1,3]\), \([1,3,3]\), \([2]\), \([2,3]\), \([2,3,3]\), \([3]\) và \([3,3]\).
Với mỗi tổ hợp, danh sách ghi các loại đá quý có trong tổ hợp đó. Chẳng hạn, \([2,3,3]\) gồm một viên đá loại \(2\) và hai viên đá loại \(3\).
Đánh số các con cá theo thứ tự xuất hiện trong dữ liệu vào. Có thể thu được các tổ hợp trên như sau: