Google Code Jam 2016 - Round 1C

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2016 - Fashion Police 48 1.0s 1G
2 Google Code Jam 2016 - Senate Evacuation 18 1.0s 1G
3 Google Code Jam 2016 - Slides! 34 1.0s 1G

1. Google Code Jam 2016 - Fashion Police

Điểm: 48 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Bạn quá hào hứng với Vòng chung kết Code Jam Thế giới 2016 nên vừa chuyển tới New York. Bạn mang theo \(J\) chiếc áo khoác khác nhau (đánh số từ 1 đến \(J\)), \(P\) chiếc quần khác nhau (đánh số từ 1 đến \(P\)), và \(S\) chiếc áo sơ mi khác nhau (đánh số từ 1 đến \(S\)). Số áo sơ mi không ít hơn số quần, và số quần không ít hơn số áo khoác: \(J\le P\le S\).

Mỗi ngày, bạn chọn một áo khoác, một quần và một áo sơ mi để tạo thành một bộ trang phục. Mỗi tối bạn giặt tất cả quần áo, nên hôm sau món nào cũng có thể dùng lại.

Ở New York, Cảnh sát Thời trang luôn theo dõi và ghi lại trang phục hằng ngày của mọi người. Nếu phát hiện bạn mặc cùng một bộ trang phục chính xác hai lần, họ sẽ lập tức đưa bạn tới Nhà tù Thời trang trên Đại lộ 5 để bắt buộc thay đổi phong cách; bạn chắc chắn muốn tránh điều đó! Bạn cũng bị đưa đi ngay nếu họ phát hiện cùng một cặp hai món đồ đã được mặc tổng cộng quá \(K\) lần. Một cặp có thể là một áo khoác cụ thể với một quần cụ thể, một áo khoác cụ thể với một áo sơ mi cụ thể, hoặc một quần cụ thể với một áo sơ mi cụ thể. Ví dụ, trong hai bộ (áo khoác 1, quần 2, áo sơ mi 3) và (áo khoác 1, quần 1, áo sơ mi 3), cặp (áo khoác 1, áo sơ mi 3) xuất hiện hai lần, còn cặp (quần 1, áo sơ mi 3) chỉ xuất hiện một lần.

Bạn mặc một bộ mỗi ngày. Hãy tìm số ngày lớn nhất có thể tránh Nhà tù Thời trang và đưa ra danh sách trang phục dùng cho từng ngày.

Dữ liệu vào

Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test gồm một dòng chứa bốn số nguyên \(J,P,S,K\).

Dữ liệu ra

Với mỗi bộ test, trước tiên in Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn y là số ngày lớn nhất bạn có thể tránh bị đưa tới Nhà tù Thời trang. Sau đó in thêm \(y\) dòng, mỗi dòng gồm ba số nguyên: số hiệu áo khoác, quần và áo sơ mi, theo thứ tự đó, tạo thành trang phục của một ngày. Danh sách có thể theo bất kỳ thứ tự nào, nhưng không được gây ra vi phạm nào đã mô tả.

Nếu có nhiều đáp án, bạn có thể in bất kỳ đáp án nào.

Ràng buộc

  • \(1 \le T \le 100\).
  • \(1 \le J \le P \le S\).
  • \(1 \le K \le 10\).

Phân nhóm

  • Test Set 1 (Hiển thị): \(S\le3\).
  • Test Set 2 (Ẩn): \(S\le10\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 14/48 29,17%
Test Set 2 34/48 70,83%

Ví dụ

Ví dụ 1

Input
4
1 1 1 10
1 2 3 2
1 1 3 2
1 2 3 1
Output
Case #1: 1
1 1 1
Case #2: 4
1 1 2
1 2 3
1 2 1
1 1 1
Case #3: 2
1 1 2
1 1 1
Case #4: 2
1 1 3
1 2 1
Giải thích

Đầu ra mẫu trình bày một bộ đáp án; có thể tồn tại các đáp án khác.

Trong bộ test số 1, dù Cảnh sát Thời trang đặt \(K=10\) khá dễ chịu, chỉ có một bộ trang phục khả dĩ nên bạn chỉ tránh được nhà tù trong một ngày.

Trong bộ test số 2, thêm bất kỳ bộ nào khác cũng khiến bạn bị đưa đi:

  • Thêm 1 1 3 sẽ dùng cặp (áo khoác 1, quần 1) quá 2 lần.
  • Thêm 1 2 2 sẽ dùng cặp (áo khoác 1, quần 2) quá 2 lần.

Trong trường hợp này, bất kỳ tập 5 bộ trang phục nào cũng chứa ít nhất một vi phạm.

Lưu ý rằng các số hiệu áo khoác, quần và áo sơ mi trong một bộ riêng lẻ không cần không giảm như quan hệ \(J\le P\le S\).

Trong bộ test số 3, chỉ có một cặp áo khoác–quần và buộc phải dùng lại nó, nên dù thay áo sơ mi thế nào cũng không thể tạo hơn \(K=2\) bộ khác nhau.

Trong bộ test số 4, một tập trang phục cực đại khác là:

1 2 2
1 1 1

Nguồn

Google Code Jam 2016, Vòng 1C, bài Fashion Police.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

2. Google Code Jam 2016 - Senate Evacuation

Điểm: 18 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Một đám cháy nhỏ bùng lên trong phòng thượng viện, và mọi người cần được sơ tán!

Trong phòng có một số thượng nghị sĩ, mỗi người thuộc một trong \(N\) đảng chính trị. Các đảng được đặt tên theo \(N\) chữ cái tiếng Anh viết hoa đầu tiên.

Cửa thoát hiểm đủ rộng cho tối đa hai thượng nghị sĩ, nên ở mỗi bước sơ tán, bạn có thể đưa một hoặc hai người ra khỏi phòng.

Quy tắc thượng viện cho phép những người còn trong phòng biểu quyết bất kỳ dự luật nào vào bất kỳ lúc nào, kể cả giữa quá trình sơ tán! Vì vậy, phải sơ tán sao cho không đảng nào từng có đa số tuyệt đối. Nói cách khác, sau bất kỳ bước sơ tán nào, không được có quá một nửa số thượng nghị sĩ còn trong phòng thuộc cùng một đảng.

Bạn có thể lập một kế hoạch sơ tán không? Thượng viện đang trông cậy vào bạn!

Dữ liệu vào

Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test gồm hai dòng. Dòng đầu chứa số nguyên \(N\), là số đảng. Dòng thứ hai chứa \(N\) số nguyên \(P_1,P_2,\ldots,P_N\), trong đó \(P_i\) là số thượng nghị sĩ của đảng mang tên chữ cái thứ \(i\) trong bảng chữ cái.

Dữ liệu ra

Với mỗi bộ test, in một dòng Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn y là kế hoạch sơ tán. Kế hoạch là danh sách các chỉ dẫn cách nhau bằng dấu cách, theo đúng thứ tự thực hiện. Mỗi chỉ dẫn gồm một hoặc hai ký tự, biểu diễn đảng của những thượng nghị sĩ được đưa ra ở bước đó.

Đề bài bảo đảm luôn tồn tại ít nhất một kế hoạch hợp lệ. Nếu có nhiều kế hoạch, bạn có thể in bất kỳ kế hoạch nào.

Ràng buộc

  • \(1 \le T \le 50\).
  • Trước khi sơ tán, không đảng nào có đa số tuyệt đối.
  • \(1 \le P_i \le 1000\) với mọi \(i\).

Phân nhóm

  • Test Set 1 (Hiển thị): \(2 \le N \le 3\)\(\sum P_i \le 9\).
  • Test Set 2 (Ẩn): \(2 \le N \le 26\)\(\sum P_i \le 1000\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 8/18 44,44%
Test Set 2 10/18 55,56%

Ví dụ

Ví dụ 1

Input
4
2
2 2
3
3 2 2
3
1 1 2
3
2 3 1
Output
Case #1: AB BA
Case #2: AA BC C BA
Case #3: C C AB
Case #4: BA BB CA
Giải thích

Đầu ra mẫu trình bày một bộ đáp án; có thể tồn tại các đáp án khác.

Ở bộ test số 1, mỗi đảng A và B có hai người. Mỗi lần đưa ra một người của mỗi đảng sẽ duy trì cân bằng hoàn hảo cho tới khi sơ tán xong.

Bộ test số 2 diễn ra như sau:

  • Ban đầu: 3 A, 2 B, 2 C.
  • Sơ tán AA: còn 1 A, 2 B, 2 C.
  • Sơ tán BC: còn 1 A, 1 B, 1 C.
  • Sơ tán C: còn 1 A, 1 B.
  • Sơ tán AB: hoàn tất.

Không thể bắt đầu bằng BC, vì khi đó còn 3 A, 1 B và 1 C; đảng A sẽ có đa số tuyệt đối (\(3/5=60\%\)).

Với bộ test số 3, CC AB cũng là đáp án hợp lệ; C C AB cũng hợp lệ dù cần ba bước thay vì hai.

Nguồn

Google Code Jam 2016, Vòng 1C, bài Senate Evacuation.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.

3. Google Code Jam 2016 - Slides!

Điểm: 34 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Gooli là một công ty khổng lồ sở hữu \(B\) tòa nhà trong một vùng đồi núi. Các tòa nhà được đánh số từ 1 đến \(B\).

Tổng giám đốc muốn xây một hệ thống cầu trượt giữa các tòa nhà để đi từ văn phòng ở tòa nhà 1 tới quán cà phê yêu thích ở tòa nhà \(B\). Cầu trượt dĩ nhiên chỉ đi một chiều, nhưng các tòa nhà cao và có thang máy, nên một cầu trượt có thể bắt đầu ở bất kỳ tòa nhà nào, kết thúc ở bất kỳ tòa nhà nào khác và đi theo một trong hai hướng. Cụ thể, với hai tòa nhà \(x,y\), có thể xây không quá một cầu từ \(x\) tới \(y\) và không quá một cầu từ \(y\) tới \(x\). Ngoại lệ là không cầu trượt nào được xuất phát từ tòa nhà \(B\), vì khi đã tới đó, tổng giám đốc không cần trượt tiếp.

Để kỷ niệm Gooli vừa tròn đúng \(M\) mili-giây tuổi, thiết kế phải bảo đảm tổng giám đốc có đúng \(M\) cách khác nhau để đi từ tòa nhà 1 tới tòa nhà \(B\) bằng các cầu trượt mới. Một cách là một dãy tòa nhà bắt đầu bằng 1, kết thúc bằng \(B\), và giữa mọi cặp tòa nhà liên tiếp \(x,y\) đều có cầu trượt từ \(x\) tới \(y\). Lưu ý rằng tổng giám đốc không yêu cầu mọi tòa nhà phải đi tới được mọi tòa nhà khác.

Bạn có thể đưa ra một hệ thống gồm ít nhất một cầu trượt thỏa yêu cầu, hay xác định rằng điều đó là không thể?

Dữ liệu vào

Dòng đầu tiên chứa số bộ test \(T\). Mỗi bộ test là một dòng chứa hai số nguyên \(B\)\(M\) như mô tả ở trên.

Dữ liệu ra

Với mỗi bộ test, in một dòng Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn yPOSSIBLE hoặc IMPOSSIBLE tùy theo yêu cầu có thể được đáp ứng hay không. Nếu có thể, in thêm \(B\) dòng, mỗi dòng gồm \(B\) ký tự, tạo thành ma trận mô tả một cách xây cầu hợp lệ. Ký tự thứ \(j\) của dòng thứ \(i\) (đều đánh số từ 1) là 1 nếu cần xây cầu từ tòa nhà \(i\) tới tòa nhà \(j\), và là 0 nếu không. Ký tự thứ \(i\) trên dòng thứ \(i\) luôn phải là 0, và mọi ký tự ở dòng cuối đều phải là 0.

Nếu có nhiều lời giải, bạn có thể in bất kỳ lời giải nào.

Ràng buộc

  • \(1 \le T \le 100\).

Phân nhóm

  • Test Set 1 (Hiển thị): \(2 \le B \le 6\), \(1 \le M \le 20\).
  • Test Set 2 (Ẩn): \(2 \le B \le 50\), \(1 \le M \le 10^{18}\).

Điểm các phân nhóm

Mỗi Test Set tương ứng với một subtask trên LQDOJ. Bảng dưới đây giữ nguyên điểm chính thức của Google Code Jam và quy đổi tỷ lệ trên tổng điểm của bài.

Phân nhóm Điểm Google Code Jam Tỷ lệ điểm của bài
Test Set 1 13/34 38,24%
Test Set 2 21/34 61,76%

Ví dụ

Ví dụ 1

Input
3
5 4
2 1
4 20
Output
Case #1: POSSIBLE
01001
00110
00001
00101
00000
Case #2: POSSIBLE
01
00
Case #3: IMPOSSIBLE
Giải thích

Đầu ra mẫu cho thấy một cách đáp ứng yêu cầu ở mỗi bộ test; có thể tồn tại các đáp án hợp lệ khác.

Hình sau minh họa đáp án mẫu cho bộ test số 1:

Bốn cách đi từ tòa nhà 1 tới tòa nhà 5 là:

  • 1 tới 5;
  • 1 tới 2 tới 3 tới 5;
  • 1 tới 2 tới 4 tới 5;
  • 1 tới 2 tới 4 tới 3 tới 5.

Trong bộ test số 3, xây các cầu \(1\to2\), \(2\to3\), \(3\to1\)\(1\to4\) sẽ tạo ra vô hạn cách tới tòa nhà 4: đi thẳng tới 4, đi quanh chu trình một lần rồi tới 4, đi quanh hai lần rồi tới 4, v.v. Nhưng tổng giám đốc yêu cầu đúng 20 cách.

Nguồn

Google Code Jam 2016, Vòng 1C, bài Slides!.

Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.