| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | Google Code Jam 2014 - New Lottery Game | 32 | 1.0s | 1G |
| 2 | Google Code Jam 2014 - The Bored Traveling Salesman | 45 | 1.0s | 1G |
| 3 | Google Code Jam 2014 - The Repeater | 23 | 1.0s | 1G |
Xổ số đang thay đổi! Trước đây, Xổ số sử dụng một máy để tạo ra một số trúng thưởng ngẫu nhiên. Nhưng do các vấn đề gian lận, Xổ số đã quyết định thêm một máy nữa. Số trúng thưởng mới sẽ là kết quả của phép toán bitwise-AND giữa hai số ngẫu nhiên được tạo ra bởi hai máy.
Để tìm bitwise-AND của \(X\) và \(Y\), hãy viết cả hai ở dạng nhị phân; khi đó một bit trong kết quả nhị phân là \(1\) nếu các bit tương ứng của \(X\) và \(Y\) đều là \(1\), và bằng \(0\) nếu ngược lại. Trong hầu hết các ngôn ngữ lập trình, phép bitwise-AND của \(X\) và \(Y\) được viết là X & Y.
Ví dụ:
Với biện pháp này, Xổ số hy vọng sẽ giảm bớt các trường hợp khiếu nại gian lận, nhưng không may một nhân viên từ công ty Xổ số đã rò rỉ thông tin sau: máy cũ sẽ luôn tạo ra một số nguyên không âm nhỏ hơn \(A\) và máy mới sẽ luôn tạo ra một số nguyên không âm nhỏ hơn \(B\).
Catalina muốn thắng giải xổ số này và để thử vận may, cô ấy quyết định mua tất cả các số nguyên không âm nhỏ hơn \(K\).
Cho \(A\), \(B\) và \(K\), Catalina muốn biết có bao nhiêu cách khác nhau mà các máy có thể tạo ra một cặp số để giúp cô ấy trở thành người chiến thắng.
Bạn có thể giúp cô ấy không?
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). \(T\) dòng tiếp theo, mỗi dòng chứa ba số \(A\), \(B\) và \(K\).
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à số lượng cặp số khả thi mà các máy có thể tạo ra để Catalina thắng cuộc.
Small dataset:
Large dataset:
\(1 \le A \le 10^9\).
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/32 | 25% |
| Test Set 2 | 24/32 | 75% |
Ví dụ 1
5
3 4 2
4 5 2
7 8 5
45 56 35
103 143 88
Case #1: 10
Case #2: 16
Case #3: 52
Case #4: 2411
Case #5: 14377
Trong bộ test đầu tiên, có 10 cặp khả thi được tạo ra bởi máy cũ và máy mới tương ứng giúp cô ấy thắng cuộc: <0,0>, <0,1>, <0,2>, <0,3>, <1,0>, <1,1>, <1,2>, <1,3>, <2,0> và <2,1>. Lưu ý rằng <0,1> không giống với <1,0>. Ngoài ra, mặc dù cặp <2, 2> có thể được tạo ra bởi các máy nhưng nó không giúp Catalina thắng vì (2 AND 2) = 2 và cô ấy chỉ mua các số 0 và 1.
Google Code Jam 2014, Vòng 1B, bài New Lottery Game.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Sếp của bạn đang cử bạn đi một chuyến công tác bán hàng quốc tế. Thật là vui mừng!
Bạn có \(N\) thành phố (được đánh số từ \(1\) đến \(N\)) cần ghé thăm và có thể di chuyển giữa chúng bằng một tập hợp các chuyến bay khứ hồi giữa các thành phố.
Tất cả các thành phố phải được ghé thăm ít nhất một lần. Để làm điều này, bạn có thể đặt bất kỳ số lượng vé nào, tuân theo các điều kiện sau:
Bây giờ bạn có thể cố gắng giảm thiểu tổng quãng đường di chuyển, nhưng bạn đã làm điều đó lần trước rồi, nên việc đó sẽ rất nhàm chán. Thay vào đó, bạn nhận thấy rằng mỗi thành phố có một mã bưu chính (ZIP code) gồm 5 chữ số riêng biệt. Khi bạn ghé thăm một thành phố lần đầu tiên (bao gồm cả thành phố bạn bắt đầu), bạn viết mã ZIP đó xuống và nối chúng thành một số lớn (nối theo thứ tự bạn ghé thăm mỗi thành phố lần đầu tiên). Số nhỏ nhất bạn có thể đạt được là bao nhiêu?
Dòng đầu tiên của đầu vào cho biết số lượng bộ thử nghiệm, \(T\). \(T\) bộ thử nghiệm tiếp theo.
Mỗi bộ thử nghiệm bắt đầu bằng một dòng chứa hai số nguyên: số lượng thành phố \(N\) và số lượng chuyến bay khứ hồi có thể có \(M\).
\(N\) dòng tiếp theo, với dòng thứ \(i\) chứa mã ZIP gồm 5 chữ số của thành phố thứ \(i\). Không có mã ZIP nào có số 0 ở đầu và tất cả các mã ZIP trong mỗi bộ thử nghiệm là khác nhau.
\(M\) dòng tiếp theo, mỗi dòng chứa hai số nguyên \(i\) và \(j\) (\(1 \le i < j \le N\)) cho biết có một chuyến bay khứ hồi tồn tại giữa thành phố thứ \(i\) và thành phố thứ \(j\). Tất cả các chuyến bay sẽ khác nhau trong mỗi bộ thử nghiệm.
Đảm bảo rằng bạn có thể ghé thăm mọi thành phố theo các quy tắc trên.
Đối với mỗi bộ thử nghiệm, hãy xuất một dòng chứa "Case #x: y", trong đó x là số thứ tự bộ thử nghiệm (bắt đầu từ 1) và y là số nhỏ nhất bạn có thể đạt được bằng cách nối các mã ZIP dọc theo chuyến đi của mình.
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/45 | 33,33% |
| Test Set 2 | 30/45 | 66,67% |
Ví dụ 1
4
3 2
10001
20000
10000
1 2
2 3
5 4
36642
28444
50012
29651
10953
1 4
2 3
2 5
4 5
5 5
36642
28444
50012
29651
10953
1 2
1 4
2 3
2 5
4 5
6 6
10001
10002
10003
10004
10005
10006
1 2
1 6
2 3
2 4
3 5
4 5
Case #1: 100002000010001
Case #2: 1095328444500122965136642
Case #3: 1095328444366422965150012
Case #4: 100011000210003100041000510006
Trong bộ thử nghiệm cuối cùng, sau đây là trình tự các bước bạn nên thực hiện để đạt được số nhỏ nhất:
Google Code Jam 2014, Vòng 1B, bài The Bored Traveling Salesman.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.
Fegla và Omar rất thích chơi trò chơi mỗi ngày. Nhưng giờ họ đã chán tất cả các trò chơi cũ và muốn chơi một trò chơi mới. Vì vậy, họ quyết định tự sáng tạo ra trò chơi của riêng mình mang tên "The Repeater" (Người lặp lại).
Họ đã phát minh ra một trò chơi dành cho 2 người. Fegla viết xuống \(N\) chuỗi ký tự. Nhiệm vụ của Omar là làm cho tất cả các chuỗi này trở nên giống hệt nhau, nếu có thể, bằng cách sử dụng số lượng thao tác ít nhất (có thể là 0 thao tác) thuộc hai loại sau:
Hai loại thao tác này là độc lập; không nhất thiết một thao tác loại thứ nhất phải được theo sau bởi một thao tác loại thứ hai (hoặc ngược lại).
Hãy giúp Omar thắng trò chơi này bằng cách viết một chương trình để tìm xem có thể làm cho các chuỗi đã cho trở nên giống hệt nhau hay không, và tìm số bước di chuyển tối thiểu nếu có thể.
Dòng đầu tiên của dữ liệu vào cho biết số lượng bộ test, \(T\). Tiếp theo là \(T\) bộ test. Mỗi bộ test bắt đầu bằng một dòng chứa một số nguyên \(N\) là số lượng các chuỗi. Tiếp theo là \(N\) dòng, mỗi dòng chứa một chuỗi không rỗng (mỗi chuỗi sẽ chỉ bao gồm các ký tự tiếng Anh viết thường, từ 'a' đến 'z').
Với mỗi bộ test, hãy in ra 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à số bước di chuyển tối thiểu để làm cho các chuỗi giống hệt nhau. Nếu không có cách nào để làm cho tất cả các chuỗi giống hệt nhau, hãy in "Fegla Won" (trong ngoặc kép để cho rõ ràng).
\(1 \le T \le 100\).
\(1 \le\) độ dài của mỗi chuỗi \(\le 100\).
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/23 | 43,48% |
| Test Set 2 | 13/23 | 56,52% |
Ví dụ 1
5
2
mmaw
maw
2
gcj
cj
3
aaabbb
ab
aabb
2
abc
abc
3
aabc
abbc
abcc
Case #1: 1
Case #2: Fegla Won
Case #3: 4
Case #4: 0
Case #5: 3
Google Code Jam 2014, Vòng 1B, bài The Repeater.
Nguồn chính thức trên Google Coding Competitions Archive, phát hành theo giấy phép Apache-2.0.