Google Code Jam 2012 - Swinging Wild
Xem PDFBạn đang đứng trên một gờ đá trong rừng nhiệt đới, và tình yêu duy nhất của đời bạn đang đứng trên một gờ đá tương tự ở phía bên kia của một đầm lầy đầy rắn, cá sấu và nhiều sinh vật khó chịu khác. May mắn thay, có một số dây leo treo từ vòm lá của rừng trên đầm lầy, và thậm chí may mắn hơn, bằng cách nào đó bạn đã nắm được sợi dây đầu tiên trong số này (xem các hình minh họa bên dưới). Vòm lá của rừng ở độ cao không đổi, và cả hai gờ đá đều ở cùng độ cao với vòm lá. Các dây leo chỉ đơn giản là những đoạn dây treo từ vòm lá tại các điểm nhất định, với độ dài khác nhau.
Nếu bạn là một anh hùng hư cấu, bạn sẽ chỉ việc đu dây một cách cuồng nhiệt và hò hét, tại một thời điểm nào đó buông sợi dây đang giữ, bay trong không trung một lúc, bắt lấy một sợi dây khác, đu tiếp, và sau vài lần lặp lại, bạn sẽ ôm được tình yêu duy nhất của mình trong tay. Tiếc thay, bạn không phải là anh hùng hư cấu, và nếu bạn thử làm vậy, có lẽ hò hét sẽ là phần duy nhất bạn thực hiện tốt.
Kế hoạch của bạn thận trọng hơn một chút. Bạn sẽ đu trên sợi dây đang giữ, nhưng thay vì buông tay, bạn sẽ bắt lấy một sợi dây khác. Sau đó, bạn sẽ từ từ và cẩn thận leo lên sợi dây ban đầu của mình, sao cho sợi dây mới bạn đang giữ sẽ trở nên nằm ngang - hoặc đạt đến toàn bộ chiều dài của nó, hoặc đạt đến khoảng cách giữa hai sợi dây, tùy theo giá trị nào nhỏ hơn. Sau đó, bạn sẽ nghỉ ngơi một chút và đu tiếp để lặp lại quá trình này. Lưu ý rằng bạn không nhất thiết phải bắt sợi dây đầu tiên bạn gặp khi đang đu, bạn có thể thích đu xa hơn một chút và bắt một sợi dây ở xa hơn. Bạn cũng có thể leo lên sợi dây bạn đang đu qua lại để giảm khoảng cách giữa bạn và gốc của sợi dây. Thực tế, điều này có nghĩa là bạn có thể bắt bất kỳ sợi dây nào mà sợi dây của bạn cắt qua khi đang đu. Lưu ý rằng bạn sẽ không leo xuống dây khi đang đu.
Một điều khác biệt nữa giữa bạn và bất kỳ anh hùng hư cấu nào là trước khi bắt đầu toàn bộ quy trình khá rủi ro này, bạn muốn biết liệu thực sự có thể sang được bờ bên kia của khu rừng theo cách này hay không. Và đây là câu hỏi bạn phải trả lời trong bài toán này.
Dữ liệu vào
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) bộ test tiếp theo. Dòng đầu tiên của mỗi bộ test chứa số lượng dây leo \(N\). \(N\) dòng mô tả các dây leo tiếp theo, mỗi dòng gồm một cặp số nguyên \(d_i\) và \(l_i\) - tương ứng là khoảng cách của dây leo so với gờ đá của bạn và chiều dài của dây leo. Dòng cuối cùng của bộ test chứa khoảng cách \(D\) đến gờ đá nơi tình yêu của bạn đang đợi. Bạn bắt đầu bằng việc nắm giữ sợi dây đầu tiên.
Dữ liệu ra
Đối với mỗi bộ test, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự bộ test (bắt đầu từ 1) và y là YES hoặc NO, cho biết liệu bạn có thể đến được với tình yêu của mình hay không, dựa trên các quy tắc trên.
Ràng buộc
- \(0 < d_i, l_i, D \le 10^9\).
- \(T \le 30\).
- \(d_i < d_{i+1}\).
- Vì bạn giữ sợi dây đầu tiên, \(d_0 \le l_0\).
- \(d_{N-1} < D\).
Phân nhóm
- Test set 1 (Visible Verdict): \(1 \le N \le 100\).
- Test set 2 (Hidden Verdict): \(1 \le N \le 10000\). Tổng số dây leo trong tất cả các bộ test không quá 60000.
Đ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 | 5/14 | 35,71% |
| Test Set 2 | 9/14 | 64,29% |
Ví dụ
Ví dụ 1
Input
4
3
3 4
4 10
6 10
9
3
3 4
4 10
7 10
9
2
6 6
10 3
13
2
6 6
10 3
14
Output
Case #1: YES
Case #2: NO
Case #3: YES
Case #4: NO
Note
Trong trường hợp đầu tiên, bạn giữ sợi dây đầu tiên tại điểm cách gốc của nó 3 đơn vị. Bạn đu mạnh, bỏ qua sợi dây thứ hai và vừa đủ bắt được sợi dây thứ ba. Hình dưới đây mô tả tình huống bắt đầu, và bạn có thể chạm tới bất kỳ sợi dây nào có gốc nằm trong khoảng màu đỏ:
Sau khi nghỉ ngơi, bạn leo xuống sợi dây thứ ba và leo lên sợi dây thứ nhất, để thấy mình cách điểm bắt đầu 3 đơn vị, chạm vào vòm lá và giữ cả sợi dây thứ nhất và thứ ba. Bây giờ bạn buông sợi dây thứ nhất, đu lại và một lần nữa vừa đủ chạm tới gờ đá, nơi tình yêu của bạn đang chờ. Hình dưới đây mô tả tình huống sau khi bạn bắt được sợi dây thứ ba và leo qua gốc của sợi dây thứ nhất. Một lần nữa, bạn có thể chạm tới bất kỳ sợi dây nào có gốc nằm trong khoảng màu đỏ:
Trong trường hợp thứ hai, bạn sẽ không chạm tới sợi dây thứ ba trong lần đu đầu tiên, vì vậy lựa chọn duy nhất của bạn là bắt sợi dây thứ hai. Tuy nhiên, vì nó được gắn cách điểm bắt đầu 4 đơn vị, bạn chỉ có thể (bằng cách leo lên sợi dây thứ nhất) tạo cho mình tầm đu 1 đơn vị - rõ ràng là quá ít để chạm tới sợi dây thứ ba. Do đó, bạn thậm chí không thể chạm tới sợi dây thứ ba, chưa nói đến phía bên kia của đầm lầy. Tốt hơn hết là đi tìm đường khác (hoặc một tình yêu mới).
Trong trường hợp thứ ba, lưu ý rằng nếu bạn chỉ đu trên sợi dây thứ nhất bạn đang giữ, đường đi của bạn sẽ không cắt sợi dây thứ hai - bạn phải leo lên một chút trong khi đu (may mắn thay, bạn có thể) để chạm tới sợi dây thứ hai. Hãy nhớ rằng, bạn chỉ có thể leo lên trong khi đu, bạn không thể leo xuống (vì sợi dây đi lên thì căng và bạn có thể dồn trọng lượng lên nó, trong khi sợi dây đi xuống thì đu tự do). Trong trường hợp thứ tư, mặc dù bạn có thể chạm tới sợi dây thứ hai, nhưng nó quá ngắn để chạm tới gờ đá cuối cùng.
Nguồn
Google Code Jam 2012, Vòng 2, bài Swinging Wild.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Kỳ thi:
- Google Code Jam 2012 - Round 2 (26 Tháng năm, 2012)


Bình luận