Google Code Jam 2009 - Bribe the Prisoners

Xem PDF




Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1600 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Trong một vương quốc, có các phòng giam (được đánh số từ 1 đến \(P\)) được xây dựng tạo thành một đoạn thẳng. Các phòng số \(i\)\(i+1\) nằm cạnh nhau, và các tù nhân ở các phòng cạnh nhau được gọi là "hàng xóm". Một bức tường có cửa sổ ngăn cách các phòng cạnh nhau, và hàng xóm có thể giao tiếp qua cửa sổ đó.

Tất cả tù nhân sống trong hòa bình cho đến khi một tù nhân được thả. Khi điều đó xảy ra, những người hàng xóm của tù nhân được thả sẽ biết tin, và mỗi người lại truyền tin này cho hàng xóm khác của mình. Tù nhân đó lại truyền tiếp cho hàng xóm khác của anh ta, và cứ thế cho đến khi tin tức chạm đến một tù nhân không còn hàng xóm nào khác (vì anh ta ở phòng 1, hoặc phòng \(P\), hoặc phòng bên cạnh đang trống). Một tù nhân khi phát hiện ra một tù nhân khác đã được thả sẽ tức giận đập phá mọi thứ trong phòng mình, trừ khi anh ta được hối lộ bằng một đồng tiền vàng. Vì vậy, sau khi thả một tù nhân ở phòng \(A\), tất cả các tù nhân đang ở hai bên phòng \(A\) - cho đến phòng 1, phòng \(P\) hoặc một phòng trống - cần phải được hối lộ.

Giả sử rằng mỗi phòng giam ban đầu có đúng một tù nhân, và mỗi ngày chỉ có thể thả một tù nhân. Cho danh sách \(Q\) tù nhân sẽ được thả trong \(Q\) ngày, hãy tìm tổng số đồng tiền vàng tối thiểu cần dùng để hối lộ nếu các tù nhân có thể được thả theo bất kỳ thứ tự nào.

Lưu ý rằng mỗi lần hối lộ chỉ có tác dụng trong một ngày. Nếu một tù nhân đã được hối lộ hôm qua nghe tin về một tù nhân khác được thả hôm nay, anh ta cần phải được hối lộ lần nữa.

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\). \(N\) bộ test theo sau. Mỗi bộ test gồm 2 dòng.
Dòng đầu tiên có định dạng:

P Q

trong đó \(P\) là số lượng phòng giam và \(Q\) là số lượng tù nhân sẽ được thả.
Tiếp theo là một dòng chứa \(Q\) số phòng khác nhau (của các tù nhân sẽ được thả), cách nhau bởi dấu cách, được sắp xếp theo thứ tự tăng dần.

Dữ liệu ra

Với mỗi bộ test, xuất một dòng có định dạng:

Case #X: C

trong đó \(X\) là số thứ tự bộ test, bắt đầu từ 1, và \(C\) là số lượng đồng tiền vàng tối thiểu cần thiết.

Ràng buộc

  • \(1 \le N \le 100\)
  • \(Q \le P\)
  • Mỗi số phòng nằm trong khoảng từ 1 đến \(P\), bao gồm cả hai đầu.

Phân nhóm

  • Small dataset:

    • \(1 \le P \le 100\)
    • \(1 \le Q \le 5\)
    • Large dataset:

    • \(1 \le P \le 10000\)

    • \(1 \le Q \le 100\)

Đ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 15/50 30%
Test Set 2 35/50 70%

Ví dụ

Ví dụ 1

Input
2
8 1
3
20 3
3 6 14
Output
Case #1: 7
Case #2: 35
Note

Ghi chú

Trong ví dụ thứ hai, đầu tiên bạn thả người ở phòng 14, sau đó là phòng 6, rồi đến phòng 3. Số đồng tiền vàng cần thiết là \(19 + 12 + 4 = 35\). Nếu thay vào đó bạn thả người ở phòng 6 trước, chi phí sẽ là \(19 + 4 + 13 = 36\).

Nguồn

Google Code Jam 2009, Vòng 1C, bài Bribe the Prisoners.

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ình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: