| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2017 - Pony Express | 40 | 1.0s | 1G |
| 2 | Google Code Jam 2017 - Stable Neigh-bors | 35 | 1.0s | 1G |
| 3 | Google Code Jam 2017 - Steed 2: Cruise Control | 25 | 1.0s | 1G |
Năm 1860, Pony Express là hệ thống chuyển thư nhanh nhất nối bờ Đông và bờ Tây Hoa Kỳ. Hệ thống phục vụ \(N\) thành phố. Mỗi thành phố có đúng một con ngựa; mỗi con đi với một tốc độ không đổi nhất định và có tổng quãng đường tối đa mà nó có thể đi trước khi quá mệt để tiếp tục.
Người đưa thư Pony Express khởi hành bằng ngựa của thành phố xuất phát. Mỗi khi tới một thành phố, người đó có thể tiếp tục dùng con ngựa hiện tại hoặc đổi sang ngựa của thành phố ấy; việc đổi ngựa diễn ra tức thời. Ngựa không bao giờ có cơ hội nghỉ, nên một phần sức bền tối đa đã dùng thì mất vĩnh viễn. Khi người đưa thư tới thành phố đích, thư được giao.
Các tuyến giữa thành phố được thiết lập qua những cuộc thương lượng phức tạp giữa chủ công ty, nhà lập pháp, đại diện công đoàn và ông anh họ Pete. Vì vậy khoảng cách không nhất thiết tuân theo lẽ thường: chúng không nhất thiết thỏa bất đẳng thức tam giác, và khoảng cách từ A đến B có thể khác khoảng cách từ B đến A.
Bạn là một doanh nhân du hành thời gian và mang theo một máy tính nhanh từ tương lai. Một máy tính chưa đủ để lập dịch vụ thư điện tử khiến Pony Express lỗi thời, nhưng có thể dùng nó để lập tuyến tối ưu. Với toàn bộ dữ liệu về đường đi, ngựa ở từng thành phố và danh sách các cặp thành phố đầu-cuối, hãy tính nhanh thời gian tối thiểu cho mỗi chuyến giao thư. Mọi chuyến giao thư được xem là độc lập; dùng thành phố hay ngựa trong một chuyến không làm chúng mất đi ở chuyến khác.
Dòng đầu chứa số lượng bộ test \(T\). Mỗi bộ test gồm:
-1 nếu không có tuyến trực tiếp từ thành phố \(i\) đến \(j\), và bằng độ dài tuyến đó (km) nếu có.Với mỗi bộ test, in một dòng Case #x: y1 y2 ... yQ, trong đó x là số thứ tự bộ test (bắt đầu từ 1), còn \(y_k\) là thời gian tối thiểu theo giờ để giao thư từ \(U_k\) đến \(V_k\).
Mỗi \(y_k\) được coi là đúng nếu sai số tuyệt đối hoặc tương đối không quá \(10^{-6}\).
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 | 16/40 | 40% |
| Test Set 2 | 24/40 | 60% |
Ví dụ 1
3
3 1
2 3
2 4
4 4
-1 1 -1
-1 -1 1
-1 -1 -1
1 3
4 1
13 10
1 1000
10 8
5 5
-1 1 -1 -1
-1 -1 1 -1
-1 -1 -1 10
-1 -1 -1 -1
1 4
4 3
30 60
10 1000
12 5
20 1
-1 10 -1 31
10 -1 10 -1
-1 -1 -1 10
15 6 -1 -1
2 4
3 1
3 2
Case #1: 0.583333333
Case #2: 1.2
Case #3: 0.51 8.01 8.0
Bộ test mẫu cuối không thể xuất hiện trong Test Set 1.
Ở bộ #1 có hai lựa chọn: dùng ngựa thành phố 1 cả hành trình hoặc đổi ngựa tại thành phố 2. Cả hai đều đủ sức bền, nhưng ngựa thành phố 2 nhanh hơn, nên đổi ngựa là tốt hơn; tổng thời gian \(1/3+1/4\).
Ở bộ #2 có hai thành phố trung gian. Nếu đổi ngựa ở thành phố 2, con ngựa cực nhanh mới không đủ sức bền nên bắt buộc đổi tiếp ở thành phố 3. Nếu giữ ngựa cũ, tại thành phố 3 có thể đổi hoặc không. Ba phương án lần lượt là: đổi tại cả 2 và 3, mất \(1/10+1/1000+10/8=1.351\); chỉ đổi tại 3, mất \(2/10+10/8=1.45\); không bao giờ đổi, mất \(12/10=1.2\).
Ở bộ #3 có rất nhiều lựa chọn. Với chuyến đầu tiên từ thành phố 2 đến 4, tối ưu là tới thành phố 1 trong \(10/1000\) giờ, đổi ngựa, rồi đi qua 2, 3, 4 bằng ngựa thành phố 1, mất thêm \((10+10+10)/60\) giờ.
Với chuyến thứ hai từ thành phố 3 đến 2, trước hết bắt buộc tới thành phố 4, mất \(10/5\). Con ngựa tương đối nhanh hiện tại không đủ sức đi nơi khác nên phải lấy ngựa thành phố 4. Có thể đi thẳng tới thành phố 1 trong 15 giờ, nhưng chậm hơn đi nó tới thành phố 2 trong 6 giờ rồi dùng ngựa cực nhanh ở thành phố 2 tới thành phố 1 với thêm \(10/1000\) giờ.
Với chuyến thứ ba từ thành phố 3 đến 1, tối ưu là dùng hai bước đầu của chuyến trước, tổng thời gian \(10/5+6=8\).
Google Code Jam 2017, Vòng 1B, bài Pony Express.
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 may mắn sở hữu \(N\) chú kỳ lân. Bờm của mỗi chú có một hoặc hai trong ba loại lông: đỏ, vàng và xanh dương. Màu nhìn thấy của bờm phụ thuộc chính xác vào các loại lông có trong đó:
Bạn có lần lượt \(R,O,Y,G,B,V\) chú kỳ lân với bờm đỏ, cam, vàng, xanh lá, xanh dương và tím.
Bạn vừa xây một chuồng tròn gồm \(N\) ô xếp thành vòng, mỗi ô kề đúng hai ô khác. Bạn muốn đặt đúng một kỳ lân vào mỗi ô. Tuy nhiên, kỳ lân cần cảm thấy mình hiếm và đặc biệt, nên không chú nào được đứng cạnh một chú khác có chung ít nhất một màu lông trong bờm. Ví dụ, bờm cam không thể kề bờm tím vì cả hai đều có lông đỏ. Tương tự, bờm xanh lá không thể kề bờm vàng vì cả hai có lông vàng.
Có thể xếp tất cả kỳ lân hay không? Nếu có, hãy đưa ra một cách xếp.
Dòng đầu chứa số lượng bộ test \(T\). Mỗi bộ test gồm một dòng chứa bảy số nguyên \(N,R,O,Y,G,B,V\).
Với mỗi bộ test, in Case #x: y, trong đó x là số thứ tự bộ test (bắt đầu từ 1). Nếu không thể xếp, y là IMPOSSIBLE; nếu có thể, y là chuỗi \(N\) ký tự mô tả các ô chuồng, bắt đầu ở một điểm tùy chọn và đọc theo chiều kim đồng hồ quanh vòng. Dùng R, O, Y, G, B, V để biểu diễn kỳ lân có bờm tương ứng. Cách xếp phải tuân thủ mọi quy tắc trên.
Nếu có nhiều cách xếp, có thể in bất kỳ cách nào.
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/35 | 37,14% |
| Test Set 2 | 22/35 | 62,86% |
Ví dụ 1
4
6 2 0 2 0 2 0
3 1 0 2 0 0 0
6 2 0 1 1 2 0
4 0 0 2 0 0 2
Case #1: RYBRBY
Case #2: IMPOSSIBLE
Case #3: YBRGRB
Case #4: YVYV
Hai bộ test mẫu cuối không thể xuất hiện trong Test Set 1.
Với bộ #1 có nhiều đáp án; một đáp án khác là BYBRYR. BYRYRB không hợp lệ: chuồng tạo thành một vòng nên ô đầu kề ô cuối.
Với bộ #2 chỉ có ba ô và mỗi ô kề cả hai ô còn lại, nên hai kỳ lân bờm vàng buộc phải kề nhau, điều không được phép.
Với bộ #3, xếp theo mẫu màu logo Google (BRYBGR) không hợp lệ vì một kỳ lân bờm xanh dương sẽ kề một kỳ lân bờm xanh lá, mà cả hai bờm đều có lông xanh dương.
Với bộ #4, không hai kỳ lân bờm vàng nào được kề nhau và cũng không hai kỳ lân bờm tím nào được kề nhau.
Google Code Jam 2017, Vòng 1B, bài Stable Neigh-bors.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Annie là tài xế xe buýt với công việc đầy căng thẳng. Cô từng thử thư giãn bằng một chuyến du thuyền Caribe, nhưng chuyến đi đó cũng hóa ra căng thẳng, nên gần đây cô chuyển sang cưỡi ngựa.
Hôm nay, Annie cưỡi ngựa về phía đông trên một con đường một chiều dài và hẹp chạy từ tây sang đông. Hiện cô ở kilômét 0 và đích nằm tại kilômét \(D\); các cột kilômét được đánh số tăng dần từ tây sang đông.
Có \(N\) con ngựa khác đang đi về phía đông trên cùng con đường. Tất cả sẽ tiếp tục đi mãi mãi và hiện đều nằm giữa ngựa của Annie với đích. Con thứ \(i\) ban đầu ở kilômét \(K_i\) và đi với tốc độ tối đa \(S_i\) km/h.
Ngựa rất lịch sự: một con \(H_1\) sẽ không vượt (đi lên trước) con \(H_2\) vốn xuất phát phía trước nó. Hai hay nhiều con có thể ở cùng vị trí trong bất kỳ khoảng thời gian nào; có thể xem ngựa là các điểm. Những con ngựa khác Annie đi ở tốc độ tối đa, trừ khi một con nhanh \(H_1\) bắt kịp một con chậm \(H_2\) phía trước; khi đó \(H_1\) giảm tốc để bằng \(H_2\).
Ngựa của Annie không có tốc độ tối đa và có thể đi với bất kỳ tốc độ nào cô chọn, miễn là không vượt con ngựa khác. Để hành trình êm ái cho cả hai, Annie muốn chọn một tốc độ “ga tự động” không đổi duy nhất cho toàn bộ quãng đường từ vị trí hiện tại tới đích, sao cho ngựa của cô không vượt bất kỳ con nào. Tốc độ lớn nhất cô có thể chọn là bao nhiêu?
Dòng đầu chứa số lượng bộ test \(T\). Mỗi bộ test bắt đầu bằng hai số nguyên \(D,N\): vị trí đích chung của các con ngựa (km) và số ngựa khác trên đường. Tiếp theo là \(N\) dòng; dòng thứ \(i\) chứa \(K_i,S_i\), vị trí ban đầu (km) và tốc độ tối đa (km/h) của con ngựa 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), còn y là tốc độ không đổi lớn nhất (km/h) Annie có thể dùng mà không vượt ngựa khác. y được coi là đúng nếu sai số tuyệt đối hoặc tương đối không quá \(10^{-6}\).
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 | 11/25 | 44% |
| Test Set 2 | 14/25 | 56% |
Ví dụ 1
3
2525 1
2400 5
300 2
120 60
60 90
100 2
80 100
70 10
Case #1: 101.000000
Case #2: 100.000000
Case #3: 33.333333
Trong bộ test mẫu #1 chỉ có một con ngựa khác (rất chậm!) trên đường; nó tới đích của Annie sau 25 giờ. Bất kỳ tốc độ nào lớn hơn 101 km/h đều khiến Annie vượt nó trước khi tới đích.
Trong bộ test mẫu #2 có hai con ngựa khác. Con nhanh bắt kịp con chậm tại kilômét 240 sau 2 giờ. Sau đó cả hai đi bằng tốc độ con chậm thêm 1 giờ và tới đích ở kilômét 300. Tốc độ lớn nhất Annie có thể chọn mà không vượt con nào là 100 km/h.
Google Code Jam 2017, Vòng 1B, bài Steed 2: Cruise Control.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.