| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2017 - Dice Straight | 25 | 20.0s | 1G |
| 2 | Google Code Jam 2017 - Omnicircumnavigation | 35 | 20.0s | 1G |
| 3 | Google Code Jam 2017 - Operation | 30 | 1.0s | 1G |
| 4 | Google Code Jam 2017 - Spanning Planning | 30 | 20.0s | 1G |
| 5 | Google Code Jam 2017 - Stack Management | 40 | 1.0s | 1G |
| 6 | Google Code Jam 2017 - Teleporters | 40 | 20.0s | 1G |
Bạn có một bộ đặc biệt gồm \(N\) xúc xắc sáu mặt; trên sáu mặt của mỗi con là sáu số nguyên dương khác nhau. Các xúc xắc khác nhau có thể được đánh số khác nhau.
Bạn muốn xếp một số hoặc toàn bộ xúc xắc thành một hàng sao cho các mặt trên tạo thành một dãy thẳng, tức là hiển thị các số nguyên liên tiếp. Với mỗi xúc xắc, bạn được chọn mặt nào nằm trên.
Dãy thẳng dài nhất có thể tạo theo cách này dài bao nhiêu?
Dòng đầu chứa số bộ test \(T\). Mỗi bộ test bắt đầu bằng một dòng chứa \(N\), số xúc xắc. Tiếp theo là \(N\) dòng, mỗi dòng gồm sáu số nguyên dương \(D_{ij}\); số thứ \(j\) trên dòng thứ \(i\) là giá trị ở mặt thứ \(j\) của xúc xắc thứ \(i\).
Với mỗi bộ test, in Case #x: y, trong đó x là số thứ tự bộ test, bắt đầu từ 1, và y là độ dài dãy thẳng dài nhất.
\(1\le N\le100\).
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 | 10/25 | 40% |
| Test Set 2 | 15/25 | 60% |
Ví dụ 1
3
4
4 8 15 16 23 42
8 6 7 5 30 9
1 2 3 4 55 6
2 10 18 36 54 86
2
1 2 3 4 5 6
60 50 40 30 20 10
3
1 2 3 4 5 6
1 2 3 4 5 6
1 4 2 6 5 3
Case #1: 4
Case #2: 1
Case #3: 3
Trong bộ test 1, tạo dãy dài 4 bằng cách lấy số 2 từ xúc xắc thứ tư, 3 từ xúc xắc thứ ba, 4 từ xúc xắc thứ nhất và 5 từ xúc xắc thứ hai.
Trong bộ test 2, không thể tạo dãy nào dài hơn dãy hiển nhiên có độ dài 1.
Trong bộ test 3, lấy 1 từ một xúc xắc, 2 từ một con khác và 3 từ con chưa dùng còn lại. Trường hợp này cho thấy nhiều xúc xắc có thể có cùng tập giá trị trên các mặt.
Google Code Jam 2017, Chung kết thế giới, bài Dice Straight.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Nhà du hành quả cảm K, có thể là tác giả bài này hoặc không, gần đây đi lại rất nhiều. Trong một chuyến đi, cô bay từ San Francisco tới Frankfurt, Johannesburg, Abu Dhabi, Singapore, Tokyo rồi trở về San Francisco. Cô đã đi vòng quanh Trái Đất theo một đường khép kín chạm mọi kinh tuyến: với mỗi kinh độ có thể có, đường đi có ít nhất một điểm ở kinh độ đó.
Tuy nhiên, K không chắc chuyến ấy đủ “siêu tuyệt vời”, vì người ta cũng có thể đi vòng quanh Trái Đất bằng cách bay tới Bắc Cực rồi đi bộ một vòng quanh đó; ngoài việc bay tới Bắc Cực, việc này không có vẻ khó. Vì vậy cô đưa ra khái niệm tổng quát hơn: omnicircumnavigation — một đường khép kín quanh Trái Đất, coi Trái Đất là mặt cầu, vẫn là một hành trình vòng quanh bất kể đặt hai cực ở đâu. Nói cách khác, đó là đường khép kín trên mặt cầu chạm mọi bán cầu có thể chọn; chạm biên bán cầu là đủ. Tương đương, đường ấy cắt mọi đại vòng, tức mọi đường tròn có đường kính lớn nhất trên mặt cầu.
Bạn được cho một dãy \(N\) điểm trên mặt cầu bán kính 1. Hãy kiểm tra đường nối chúng theo thứ tự có phải omnicircumnavigation hay không. Đường đi nối mỗi cặp điểm liên tiếp bằng tuyến ngắn nhất trên bề mặt, rồi nối điểm cuối về điểm đầu theo cùng cách. Không có hai điểm liên tiếp nào, kể cả cặp cuối–đầu, thẳng hàng với gốc tọa độ: chúng không đối cực và cũng không phải cùng một điểm trên mặt cầu.
Dòng đầu chứa số bộ test \(T\). Mỗi bộ test bắt đầu bằng \(N\), số thành phố K ghé thăm. \(N\) dòng sau chứa ba số nguyên \(X_i,Y_i,Z_i\). Điểm thứ \(i\) trên mặt cầu có tọa độ
Với mỗi bộ test, in Case #x: y, trong đó x là số thứ tự bộ test và y là YES nếu hành trình là omnicircumnavigation, ngược lại là NO.
\(3\le N\le50\).
\(3\le N\le5000\).
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 | 15/35 | 42,86% |
| Test Set 2 | 20/35 | 57,14% |
Ví dụ 1
4
3
1 0 0
0 1 0
0 0 1
8
5 5 5
5 -5 5
-5 -5 5
-5 5 5
-5 5 -5
-5 -5 -5
5 -5 -5
5 5 -5
3
1 0 0
-1 1 0
-1 -1 0
5
1 0 0
-1 1 0
2 0 0
-2 2 0
-1 -1 0
Case #1: NO
Case #2: YES
Case #3: YES
Case #4: YES
Trong bộ test 1, ba điểm nằm trên bề mặt của một góc phần tám mặt cầu và đường đi vạch theo góc phần tám đó. Có nhiều bán cầu hoàn toàn không giao đường đi.
Trong bộ test 2, tám điểm là các đỉnh của một hình lập phương nội tiếp mặt cầu; mọi bán cầu đều chứa ít nhất một phần đường đi. Chia mọi tọa độ cho 5 sẽ cho một trường hợp tương đương với cùng các điểm trên cầu.
Trong bộ test 3, bản thân đường đi là một đại vòng, nên mọi đại vòng khác phải cắt nó ở đâu đó.
Bộ test 4 dùng cùng ba điểm như bộ test 3, nhưng hai điểm đầu được ghé hai lần. Một trường hợp có thể chứa nhiều biểu diễn của cùng một điểm, và đường đi có thể lặp một điểm hoặc một cung nối nhiều lần.
Google Code Jam 2017, Chung kết thế giới, bài Omnicircumnavigation.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Ở Code Jam có một trò chơi mang tên “Operation” (không liên quan gì đến phẫu thuật). Mỗi lá bài ghi một phép toán số học cơ bản \(O_i\) — cộng, trừ, nhân hoặc chia — cùng một toán hạng nguyên bên phải \(V_i\). Chẳng hạn, một lá có thể ghi + 0, - -2 hoặc / -4. Toán hạng có thể âm hoặc bằng 0, nhưng toán hạng của phép chia không bao giờ bằng 0.
Trong mỗi ván, ta chọn một giá trị nguyên ban đầu \(S\) và bày ra \(C\) lá bài. Người chơi phải sắp thứ tự các lá, dùng mỗi lá đúng một lần; sau đó áp dụng lần lượt các phép toán lên \(S\) để thu được kết quả cuối cùng.
Dù các toán hạng đều nguyên, mọi phép tính được thực hiện trên số hữu tỉ. Ví dụ, với \(S=5\) và các lá + 1, - 2, * 3, / -2, nếu dùng theo thứ tự vừa nêu thì kết quả là \((5+1-2)\times3/(-2)=-6\). Các phép toán luôn được thực hiện theo thứ tự lá bài, không xét độ ưu tiên toán tử. Nếu dùng thứ tự - 2, / -2, + 1, * 3, kết quả là \(((5-2)/(-2)+1)\times3=-3/2\); đây chính là giá trị lớn nhất có thể đạt với bộ bài ấy.
Hãy tìm giá trị cuối cùng lớn nhất có thể và biểu diễn nó dưới dạng phân số tối giản có mẫu số dương.
Dòng đầu chứa số bộ test \(T\).
Mỗi test bắt đầu bằng hai số nguyên \(S\) và \(C\): giá trị ban đầu và số lá bài. Tiếp theo là \(C\) dòng; dòng thứ \(i\) chứa một ký tự \(O_i\) thuộc +, -, *, / và số nguyên \(V_i\), mô tả lá bài thứ \(i\).
Với mỗi test, in Case #x: y z, trong đó x là số thứ tự test bắt đầu từ 1, còn \(y,z\) là các số nguyên sao cho \(y/z\) là kết quả lớn nhất. Hai số \(y,z\) không có ước chung nào ngoài \(1\) và \(-1\), và \(z>0\).
+, -, *, /./ thì \(V_i\ne0\).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 | 10/30 | 33,33% |
| Test Set 2 | 20/30 | 66,67% |
Ví dụ 1
5
1 2
- 3
* 2
5 4
+ 1
- 2
* 3
/ -2
1000 7
* -1000
* -1000
* 1000
* 1000
* 1000
* 1000
* 1000
-1 3
- -1
* 0
/ -1
0 1
+ 0
Case #1: -1 1
Case #2: -3 2
Case #3: 1000000000000000000000000 1
Case #4: 1 1
Case #5: 0 1
Trong test 1, chiến lược tối ưu là dùng lá * 2 trước lá - 3, thu được \(-1\). Biểu diễn hữu tỉ duy nhất đúng yêu cầu là -1 1.
Test 2 chính là ví dụ ở phần mô tả, với đáp án \(-3/2\).
Trong test 3, mọi thứ tự đều cho cùng đáp án. Tử số lớn đến mức không vừa trong số nguyên 64 bit.
Trong test 4, kết quả lớn nhất là 1; một thứ tự đạt được là / -1, * 0, - -1.
Trong test 5, biểu diễn hợp lệ duy nhất là 0 1: 0 2 chưa tối giản, còn 0 -1 có mẫu âm.
Google Code Jam 2017, Chung kết thế giới, bài Operation.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Cây khung của một đồ thị vô hướng có \(N\) đỉnh là một cây gồm \(N-1\) cạnh, chỉ sử dụng các cạnh của đồ thị và chứa đủ cả \(N\) đỉnh.
Hãy xây dựng một đồ thị có ít nhất 2 và không quá 22 đỉnh sao cho đồ thị có đúng \(K\) cây khung khác nhau. Hai cây khung được coi là khác nhau khi và chỉ khi tập cạnh của chúng khác nhau.
Đồ thị phải là đồ thị đơn: giữa mỗi cặp đỉnh có nhiều nhất một cạnh và không được có khuyên, tức cạnh nối một đỉnh với chính nó.
Với mọi \(K\) trong giới hạn bên dưới, đề bài bảo đảm tồn tại ít nhất một đồ thị thỏa mãn.
Dòng đầu tiên chứa số lượng bộ test \(T\).
Mỗi test gồm một dòng chứa số nguyên \(K\): số cây khung mong muốn.
Với mỗi test, trước tiên in một dòng có dạng Case #x: y, trong đó x là số thứ tự test, bắt đầu từ 1, và \(y\) là số đỉnh của đồ thị được xây dựng. Giá trị \(y\) phải nằm trong đoạn từ 2 đến 22, kể cả hai đầu.
Sau đó, in thêm \(y\) dòng. Dòng thứ \(i\) trong số này biểu diễn đỉnh thứ \(i\) và phải chứa đúng \(y\) ký tự. Ký tự thứ \(j\) trên dòng thứ \(i\) phải là:
1 nếu đỉnh thứ \(i\) và đỉnh thứ \(j\) được nối bởi một cạnh;0 nếu không có cạnh như vậy.Ma trận này phải đối xứng và mọi phần tử trên đường chéo chính phải là 0.
Nếu có nhiều đáp án, có thể in bất kỳ đáp án hợp lệ nào. Đề bài bảo đảm tồn tại đáp án cho mọi \(K\) thuộc giới hạn.
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 | 30/30 | 100% |
Ví dụ 1
2
3
8
Case #1: 3
011
101
110
Case #2: 4
0111
1001
1001
1110
Trong test thứ nhất, đồ thị là một tam giác. Xóa bất kỳ một trong ba cạnh đều tạo ra một cây khung khác nhau.
Trong test thứ hai, các cạnh của đồ thị được in là \(1-2\), \(1-3\), \(1-4\), \(2-4\) và \(3-4\). Tám cây khung khác nhau có các tập cạnh lần lượt là:
1-2, 1-3, 1-4
1-2, 1-3, 2-4
1-2, 1-3, 3-4
1-2, 1-4, 3-4
1-2, 2-4, 3-4
1-3, 1-4, 2-4
1-3, 2-4, 3-4
1-4, 2-4, 3-4
Google Code Jam 2017, Chung kết thế giới, bài Spanning Planning.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Bạn đang chơi một trò solitaire với \(N\) chồng bài ngửa, ban đầu mỗi chồng có \(C\) lá. Mỗi lá có một giá trị và một chất; không có hai lá nào trong cùng ván mang cùng cặp giá trị/chất.
Trong một nước đi, bạn được làm đúng một trong hai việc:
Bạn thắng nếu có thể thực hiện một dãy nước đi để cuối cùng mỗi chồng chứa nhiều nhất một lá. Hãy xác định có thể thắng từ cách xếp ban đầu hay không.
Dòng đầu chứa số chồng dựng sẵn \(P\) dùng trong các test. Sau đó là \(P\) dòng. Dòng thứ \(i\) bắt đầu bằng \(C_i\), số lá của chồng dựng sẵn thứ \(i\), rồi đến \(C_i\) cặp số \((V_{ij},S_{ij})\). Cặp thứ \(j\) cho giá trị và chất của lá thứ \(j\) tính từ đỉnh xuống.
Tiếp theo là một dòng chứa số test \(T\). Mỗi test bắt đầu bằng \(N,C\), lần lượt là số chồng và số lá trong mỗi chồng của test. Dòng sau chứa \(N\) chỉ số \(P_i\) (đánh số từ 0), chỉ ra các chồng dựng sẵn được dùng.
Với mỗi test, in Case #x: y, trong đó x là số thứ tự test bắt đầu từ 1 và y là POSSIBLE nếu có thể thắng, hoặc IMPOSSIBLE nếu không thể.
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 | 10/40 | 25% |
| Test Set 2 | 30/40 | 75% |
Ví dụ 1
5
2 7 2 7 1
2 6 4 7 4
2 3 2 6 2
2 4 2 10 2
2 5 4 7 3
2
2 2
0 2
3 2
4 1 3
Case #1: POSSIBLE
Case #2: IMPOSSIBLE
Trong test 1 có hai chồng, mỗi chồng hai lá. Chồng thứ nhất có lá 7 chất 2 ở trên và lá 7 chất 1 bên dưới; chồng thứ hai có lá 3 chất 2 ở trên và lá 6 chất 2 bên dưới.
Ta thắng như sau: bỏ lá 3 chất 2 khỏi chồng thứ hai; bỏ tiếp lá 6 chất 2, khiến chồng thứ hai rỗng; rồi chuyển lá 7 chất 2 sang chồng rỗng. Lúc này mọi chồng đều có nhiều nhất một lá.
Trong test 2 có ba chồng, mỗi chồng hai lá. Nước duy nhất là bỏ lá 5 chất 4 trên đỉnh chồng thứ ba, nhưng nước ấy không mở ra nước đi mới nào, nên không thể thắng.
Google Code Jam 2017, Chung kết thế giới, bài Stack Management.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Trong một tương lai rất gần, ở một thiên hà lân cận, bạn muốn tạm rời trách nhiệm là nhà sản xuất sợi duy nhất của hành tinh Thundera để du lịch tới Care-a-Lot, hành tinh thư giãn nhất. Phương tiện duy nhất là mạng máy dịch chuyển liên sao.
Một máy dịch chuyển là thiết bị nhỏ trôi ở một điểm trong không gian. Bạn có thể kích hoạt nó từ xa tại bất kỳ điểm nào, nhưng theo nguyên lý bảo toàn khoảng cách dịch chuyển, nó chỉ có thể đưa bạn tới một điểm khác có đúng cùng khoảng cách \(L_1\) đến máy như trước khi dịch chuyển. Với hai điểm \((x_0,y_0,z_0)\) và \((x_1,y_1,z_1)\), khoảng cách ấy là
Ba lô phản lực đã hỏng nên bạn không thể tự di chuyển. Bạn bắt đầu ở Thundera, có thể dùng một máy để tới \(p_1\), dùng một máy khác (hoặc lại máy cũ) để tới \(p_2\), v.v.; lần dịch chuyển cuối phải đưa bạn tới chính xác Care-a-Lot.
Biết tọa độ hai hành tinh và mọi máy dịch chuyển, hãy xác định chuyến đi có thể thực hiện hay không; nếu có, tìm số lần dịch chuyển ít nhất. Hai lần dùng cùng một máy vẫn được tính là hai lần dịch chuyển riêng biệt.
Mọi tọa độ trong input là số nguyên thuộc phạm vi cho trước. Tuy nhiên, các điểm trung gian được phép có tọa độ nguyên hoặc không nguyên và không bị giới hạn phạm vi.
Dòng đầu chứa số test \(T\). Mỗi test bắt đầu bằng số nguyên \(N\), số máy dịch chuyển. Tiếp theo là \(N+2\) dòng, mỗi dòng chứa ba số nguyên \(X_i,Y_i,Z_i\). Dòng đầu trong số này là tọa độ Thundera, dòng thứ hai là tọa độ Care-a-Lot, và \(N\) dòng còn lại lần lượt là tọa độ các máy.
Với mỗi test, in Case #x: y, trong đó x là số thứ tự test bắt đầu từ 1. Nếu không thể tới Care-a-Lot thì y là IMPOSSIBLE; nếu có thể thì y là số lần dịch chuyển ít nhất.
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 | 10/40 | 25% |
| Test Set 2 | 30/40 | 75% |
Ví dụ 1
3
1
0 0 0
0 4 0
0 3 0
2
0 0 1
0 0 11
0 0 3
0 0 0
3
0 0 0
6 2 0
6 0 0
3 0 0
6 1 0
Case #1: IMPOSSIBLE
Case #2: 3
Case #3: 2
Trong test 1, máy duy nhất cách Thundera đúng 3 đơn vị, nên mọi điểm tới được bằng máy đó vẫn cách nó đúng 3; Care-a-Lot chỉ cách máy 1 đơn vị nên không bao giờ tới được.
Trong test 2, tối ưu là dùng máy tại \((0,0,3)\) để đi tới \((0,0,5)\), dùng máy tại \((0,0,0)\) để đi tới \((0,0,-5)\), rồi dùng lại máy tại \((0,0,3)\) để tới \((0,0,11)\). Hai lần dùng máy đầu dịch chuyển những khoảng khác nhau vì khoảng cách tới máy ở hai thời điểm khác nhau, và vẫn tính là hai lần riêng biệt.
Trong test 3, dùng máy tại \((3,0,0)\) để tới \((6,0,0)\), rồi máy tại \((6,1,0)\) để tới \((6,2,0)\). Dù có một máy tại \((6,0,0)\), chỉ đứng đúng vị trí máy không được tính là đã sử dụng nó.
Google Code Jam 2017, Chung kết thế giới, bài Teleporters.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.