Google Code Jam 2008 - Qualification Round

Bộ đề bài

# Bài tập Điểm Thời gian: Giới hạn bộ nhớ
1 Google Code Jam 2008 - Fly Swatter 25 6.0s 1G
2 Google Code Jam 2008 - Saving the Universe 25 1.0s 1G
3 Google Code Jam 2008 - Train Timetable 25 1.0s 1G

1. Google Code Jam 2008 - Fly Swatter

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

Khả năng bạn đánh trúng một con ruồi bằng vợt tennis là bao nhiêu?

Để bắt đầu, hãy bỏ qua cán vợt. Giả sử mặt vợt là một vòng tròn hoàn hảo, có bán kính ngoài là \(R\) và độ dày là \(t\) (vì vậy bán kính trong của vòng tròn là \(R - t\)).

Mặt vợt được bao phủ bởi các dây ngang và dọc. Mỗi sợi dây là một hình trụ có bán kính \(r\). Mỗi sợi dây là một dây cung của vòng tròn (một đoạn thẳng nối hai điểm của đường tròn). Có một khoảng trống độ dài \(g\) giữa các dây lân cận. Các dây đối xứng qua tâm của vợt, tức là có một cặp dây mà tâm của chúng giao nhau tại tâm của vòng tròn.

Con ruồi là một hình cầu bán kính \(f\). Giả sử rằng vợt đang di chuyển theo một đường thẳng vuông góc với mặt phẳng của vòng tròn. Giả sử tâm của con ruồi nằm bên trong bán kính ngoài của vợt và có khả năng nằm ở bất kỳ đâu trong bán kính đó với xác suất như nhau. Bất kỳ sự giao thoa nào giữa con ruồi và vợt (vòng tròn hoặc dây) đều được tính là một cú đánh trúng.

Dữ liệu vào

Dòng đầu tiên chứa một số nguyên \(N\), số lượng bộ thử nghiệm trong tệp đầu vào.
\(N\) dòng tiếp theo, mỗi dòng chứa các số \(f\), \(R\), \(t\), \(r\)\(g\) cách nhau bởi đúng một khoảng trắng. Các số này sẽ có chính xác 6 chữ số sau dấu phẩy thập phân.

Dữ liệu ra

\(N\) dòng, mỗi dòng có dạng Case #k: P, trong đó \(k\) là số thứ tự của bộ thử nghiệm và \(P\) là xác suất đánh trúng con ruồi bằng một phần của chiếc vợt.

Các câu trả lời có sai số tương đối hoặc tuyệt đối không quá \(10^{-6}\) sẽ được coi là chính xác.

Ràng buộc

  • \(f, R, t, r\)\(g\) là các số dương và nhỏ hơn hoặc bằng \(10000\).
  • \(t < R\)
  • \(f < R\)
  • \(r < R\)

Phân nhóm

  • Small dataset (Test set 1): \(1 \le N \le 30\). Tổng số dây tối đa là 60 (tối đa 30 dây mỗi hướng).
  • Large dataset (Test set 2): \(1 \le N \le 100\). Tổng số dây tối đa là 2000 (tối đa 1000 dây mỗi hướng).

Đ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/25 20%
Test Set 2 20/25 80%

Ví dụ

Ví dụ 1

Input
5
0.250000 1.000000 0.100000 0.010000 0.500000
0.250000 1.000000 0.100000 0.010000 0.900000
0.000010 10000.000000 0.000010 0.000010 1000.000000
0.400000 10000.000000 0.000010 0.000010 700.000000
1.000000 100.000000 1.000000 1.000000 10.000000
Output
Case #1: 1.000000
Case #2: 0.910015
Case #3: 0.000000
Case #4: 0.002371
Case #5: 0.573972

Nguồn

Google Code Jam 2008, Vòng loại, bài Fly Swatter.

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 2008 - Saving the Universe

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

Truyền thuyết đô thị kể rằng nếu bạn truy cập trang chủ Google và tìm kiếm từ khóa "Google", vũ trụ sẽ nổ tung. Chúng tôi có một bí mật muốn chia sẻ... Điều đó là có thật! Làm ơn đừng thử, hoặc kể cho bất kỳ ai. Được rồi, có lẽ không phải vậy. Chúng tôi chỉ đùa thôi.

Nhưng điều tương tự không đúng với một vũ trụ xa xôi nào đó. Ở vũ trụ đó, nếu bạn tìm kiếm trên bất kỳ công cụ tìm kiếm nào bằng chính tên của công cụ tìm kiếm đó, vũ trụ sẽ thực sự nổ tung!

Để chống lại điều này, mọi người đã nghĩ ra một giải pháp thú vị. Tất cả các truy vấn được tập hợp lại với nhau. Chúng được chuyển đến một hệ thống trung tâm để quyết định truy vấn nào sẽ được gửi đến công cụ tìm kiếm nào. Hệ thống trung tâm gửi một loạt các truy vấn đến một công cụ tìm kiếm và có thể chuyển sang một công cụ khác bất cứ lúc nào. Các truy vấn phải được xử lý theo đúng thứ tự mà chúng được nhận. Hệ thống trung tâm tuyệt đối không được gửi một truy vấn đến một công cụ tìm kiếm có tên trùng với truy vấn đó. Để giảm chi phí, số lần chuyển đổi giữa các công cụ tìm kiếm phải được tối thiểu hóa.

Nhiệm vụ của bạn là cho chúng tôi biết hệ thống trung tâm sẽ phải chuyển đổi giữa các công cụ tìm kiếm bao nhiêu lần, giả sử rằng chúng ta lập trình nó một cách tối ưu.

Dữ liệu vào

Dòng đầu tiên của tệp đầu vào chứa số lượng bộ test, \(N\). \(N\) bộ test tiếp theo sẽ lần lượt xuất hiện.

Mỗi bộ test bắt đầu bằng số \(S\) -- số lượng công cụ tìm kiếm. \(S\) dòng tiếp theo, mỗi dòng chứa tên của một công cụ tìm kiếm. Mỗi tên công cụ tìm kiếm dài không quá 100 ký tự và chỉ chứa các chữ cái in hoa, chữ cái in thường, khoảng trắng và chữ số. Sẽ không có hai công cụ tìm kiếm nào có cùng tên.

Dòng tiếp theo chứa một số \(Q\) -- số lượng truy vấn đến. \(Q\) dòng tiếp theo, mỗi dòng chứa một truy vấn. Mỗi truy vấn sẽ là tên của một công cụ tìm kiếm có trong bộ test đó.

Dữ liệu ra

Với mỗi bộ test, bạn nên xuất ra:

Case #X: Y

trong đó \(X\) là số thứ tự của bộ test và \(Y\) là số lần chuyển đổi công cụ tìm kiếm.

Không tính lựa chọn công cụ tìm kiếm ban đầu là một lần chuyển đổi.

Ràng buộc

  • \(0 < N \le 20\)

Phân nhóm

  • Small dataset (Test set 1 - Visible): \(2 \le S \le 10\), \(0 \le Q \le 100\).
  • Large dataset (Test set 2 - Hidden): \(2 \le S \le 100\), \(0 \le Q \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 5/25 20%
Test Set 2 20/25 80%

Ví dụ

Ví dụ 1

Input
2
5
Yeehaw
NSM
Dont Ask
B9
Googol
10
Yeehaw
Yeehaw
Googol
B9
Googol
NSM
B9
NSM
Dont Ask
Googol
5
Yeehaw
NSM
Dont Ask
B9
Googol
7
Googol
Dont Ask
NSM
NSM
Yeehaw
Yeehaw
Googol
Output
Case #1: 1
Case #2: 0
Note

Trong trường hợp đầu tiên, một giải pháp khả thi là bắt đầu bằng cách sử dụng Dont Ask và chuyển sang NSM sau truy vấn thứ 8.
Đối với trường hợp thứ hai, bạn có thể sử dụng B9 và không cần thực hiện bất kỳ lần chuyển đổi nào.

Nguồn

Google Code Jam 2008, Vòng loại, bài Saving the Universe.

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 2008 - Train Timetable

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

Một tuyến tàu hỏa có hai ga A và B. Các đoàn tàu có thể thực hiện các chuyến đi từ A đến B hoặc từ B đến A nhiều lần trong ngày. Khi một đoàn tàu đến B từ A (hoặc đến A từ B), nó cần một khoảng thời gian nhất định trước khi sẵn sàng thực hiện hành trình ngược lại - đây được gọi là thời gian quay đầu (turnaround time). Ví dụ, nếu một đoàn tàu đến lúc 12:00 và thời gian quay đầu là 0 phút, nó có thể khởi hành ngay lập tức lúc 12:00.

Một lịch trình tàu hỏa quy định thời gian khởi hành và thời gian đến của tất cả các chuyến đi giữa A và B. Công ty tàu hỏa cần biết cần bao nhiêu đoàn tàu để bắt đầu ngày mới tại A và B nhằm đảm bảo lịch trình hoạt động thông suốt: bất cứ khi nào một đoàn tàu được lịch trình cho phép rời A hoặc B, phải thực sự có một đoàn tàu ở đó sẵn sàng khởi hành. Có các đoạn tránh trên đường ray, vì vậy các đoàn tàu không nhất thiết phải đến theo đúng thứ tự mà chúng đã rời đi. Các đoàn tàu không được phép thực hiện các chuyến đi không xuất hiện trong lịch trình.

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, \(N\). Tiếp theo là \(N\) bộ test.

Mỗi bộ test bao gồm nhiều dòng. Dòng đầu tiên là thời gian quay đầu, \(T\), tính bằng phút. Dòng tiếp theo có hai số, \(NA\)\(NB\). \(NA\) là số chuyến đi từ A đến B, và \(NB\) là số chuyến đi từ B đến A. Sau đó là \(NA\) dòng cung cấp chi tiết các chuyến đi từ A đến B.

Mỗi dòng chứa hai trường, cho biết thời gian khởi hành và thời gian đến theo định dạng HH:MM cho chuyến đi đó. Thời gian khởi hành của mỗi chuyến đi sẽ sớm hơn thời gian đến. Tất cả các lần đến và đi đều xảy ra trong cùng một ngày. Các chuyến đi có thể xuất hiện theo bất kỳ thứ tự nào - chúng không nhất thiết phải được sắp xếp theo thời gian. Các giá trị giờ và phút đều có hai chữ số, được đệm số 0 và sử dụng hệ giờ 24 tiếng (00:00 đến 23:59).

Sau \(NA\) dòng này, có \(NB\) dòng cung cấp thời gian khởi hành và thời gian đến cho các chuyến đi từ B đến A.

Dữ liệu ra

Đối với mỗi bộ test, hãy xuất một dòng chứa "Case #\(x\): " theo sau là số lượng đoàn tàu phải bắt đầu tại A và số lượng đoàn tàu phải bắt đầu tại B.

Ràng buộc

  • \(1 \le N \le 100\).
  • \(0 \le T \le 60\).

Phân nhóm

  • Small dataset (Test set 1 - Visible): \(1 \le N \le 20\); \(0 \le NA, NB \le 20\); \(0 \le T \le 5\).
  • Large dataset (Test set 2 - Hidden): \(1 \le N \le 100\); \(0 \le NA, NB \le 100\); \(0 \le T \le 60\).

Đ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/25 20%
Test Set 2 20/25 80%

Ví dụ

Ví dụ 1

Input
2
5
3 2
09:00 12:00
10:00 13:00
11:00 12:30
12:02 15:00
09:00 10:30
2
2 0
09:00 09:01
12:00 12:02
Output
Case #1: 2 2
Case #2: 2 0

Nguồn

Google Code Jam 2008, Vòng loại, bài Train Timetable.

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