Google Code Jam 2016 - Revenge of the Pancakes

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: 800 Thời gian: 1.0s Bộ nhớ: 1G Input: bàn phím Output: màn hình

Nhà Bánh Kẹp Vô Hạn vừa giới thiệu một loại bánh mới! Một mặt bánh có khuôn mặt vui vẻ bằng vụn sô-cô-la (“mặt vui”), mặt kia không có gì (“mặt trống”).

Bạn là trưởng phục vụ đang trực và nhà bếp vừa đưa một chồng bánh để phục vụ khách. Như mọi người phục vụ bánh giỏi, bạn có thị lực tia X và biết mỗi chiếc đang ngửa mặt vui hay mặt trống. Bạn nghĩ khách sẽ vui nhất nếu khi phục vụ, mọi chiếc bánh đều ngửa mặt vui.

Bạn biết thao tác sau: cẩn thận nhấc một số chiếc ở đỉnh chồng (có thể là toàn bộ), lật cả nhóm, rồi đặt lại lên những chiếc không nhấc. Cả nhóm được lật trong một chuyển động, không lật riêng từng chiếc. Chính xác hơn, đánh số bánh \(1,2,\ldots,N\) từ trên xuống dưới và chọn \(i\) chiếc đầu. Sau khi lật, thứ tự là \(i,i-1,\ldots,2,1,i+1,\ldots,N\). Các bánh \(1\) đến \(i\) đổi mặt đang ngửa; các bánh \(i+1\) đến \(N\) giữ nguyên mặt.

Ký hiệu mặt vui là +, mặt trống là -. Với chồng --+- từ trên xuống, có thể nhấc ba chiếc đầu, lật cả nhóm rồi đặt lên chiếc thứ tư không đổi, thu được -++-. Những thao tác hợp lệ khác là lật một, hai hoặc cả bốn chiếc đầu. Không được lật hai chiếc ở giữa hay riêng chiếc cuối vì chỉ được lấy một đoạn bắt đầu từ đỉnh.

Bạn sẽ không phục vụ cho đến khi mọi bánh đều ngửa mặt vui, nhưng không muốn bánh nguội. Nếu luôn lựa chọn tối ưu, cần ít nhất bao nhiêu thao tác?

Dữ liệu vào

Dòng đầu chứa \(T\). Mỗi bộ test gồm một chuỗi \(S\); mỗi ký tự là + (ban đầu ngửa mặt vui) hoặc - (ban đầu ngửa mặt trống). Đọc từ trái sang phải tương ứng với chồng bánh từ trên xuống dưới.

Dữ liệu ra

Với mỗi bộ test, in Case #x: y, trong đó \(x\) bắt đầu từ 1 và \(y\) là số thao tác nhỏ nhất để mọi bánh ngửa mặt vui.

Ràng buộc

  • \(1\le T\le100\).
  • Mọi ký tự của \(S\)+ hoặc -.

Phân nhóm

  • Test Set 1 (Visible): \(1\le |S|\le10\).
  • Test Set 2 (Hidden): \(1\le |S|\le100\).

Đ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 10/20 50%
Test Set 2 10/20 50%

Ví dụ

Ví dụ 1

Input
5
-
-+
+-
+++
--+-
Output
Case #1: 1
Case #2: 1
Case #3: 2
Case #4: 0
Case #5: 3
Giải thích

Ở #1 chỉ cần lật chiếc duy nhất. Ở #2 chỉ cần lật chiếc đầu.

Ở #3 cần hai thao tác. Một cách tối ưu là lật chiếc đầu để thành --, rồi lật cả hai để thành ++. Không thể chỉ lật riêng chiếc dưới cùng; mỗi thao tác phải chọn một đoạn từ đỉnh.

Ở #4 mọi bánh đã ngửa mặt vui nên không cần làm gì.

Ở #5, một cách là lật toàn bộ để được +-++, lật chiếc đầu để được --++, rồi lật hai chiếc đầu để được ++++.

Nguồn

Google Code Jam 2016, Vòng loại, bài Revenge of the Pancakes.

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: