Buckshot Roulette

Xem PDF



Tác giả:
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, Output, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 1600 Thời gian: 0.5s Bộ nhớ: 256M Input: bàn phím Output: màn hình

Đây là 1 bài Communication

\({\qquad \qquad\qquad \qquad \qquad\qquad \qquad \qquad\qquad \qquad \qquad}\)Buckshot Roulette
\({\qquad \qquad\qquad \qquad \qquad\qquad \qquad \qquad\qquad \qquad}\) \(1.\) hunglvh \(là\ người\ chơi\ thứ\ nhất.\)
\({\qquad \qquad\qquad \qquad \qquad\qquad \qquad \qquad\qquad \qquad}\) \(2.\) just_coast \(là\ người\ chơi\ thứ\ hai.\)
\({\qquad \qquad\qquad \qquad \qquad\qquad \qquad \qquad\qquad \qquad}\) \(3.\) Youtuber_TWK \(là\ Dealer.\)

Dealer Youtuber_TWK điều khiển một khẩu súng gồm \(N\) viên đạn, trong đó có đúng \(L\) viên live và \(N-L\) viên blank.

Cả hunglvhjust_coast đều bắt đầu với \(3\) HP. Dealer Youtuber_TWK không có HP và không phải là một người chơi.

Ván đấu gồm tối đa \(R\) màn chơi. Mỗi màn chơi sử dụng đúng một khẩu súng.

\({\qquad}\) Luật chơi

Ở mỗi lượt, người chơi đang có lượt chọn một trong hai hành động:

  • SELF — bắn vào chính mình.
  • OPPONENT — bắn vào người chơi còn lại.

Chiến thuật của cả hai người chơi được cố định và chỉ phụ thuộc vào số lượng đạn còn lại:

  • Nếu \(x=0\), tức không còn viên live nào, người chơi phải chọn SELF
  • Nếu \(y=0\), tức không còn viên blank nào, người chơi phải chọn OPPONENT
  • Nếu \(x>0\)\(y>0\), người chơi phải chọn SELF

Trong đó:

  • \(x\) là số viên live còn lại.
  • \(y\) là số viên blank còn lại.

Sau khi người chơi chọn hành động, Dealer thực hiện phát bắn.

  • Nếu viên đạn là live, mục tiêu của phát bắn mất \(1\) HP.
  • Nếu viên đạn là blank, không người chơi nào mất HP.
  • Nếu người chơi chọn SELF và viên đạn là blank, người đó được giữ lượt.
  • Trong mọi trường hợp khác, lượt chuyển sang người chơi còn lại.
  • Sau mỗi phát bắn, viên đạn vừa sử dụng được lấy khỏi súng.

Ván đấu kết thúc ngay khi một người chơi có \(0\) HP.

Nếu cả hai người chơi vẫn còn sống sau khi sử dụng hết khẩu súng:

  • Nếu đây là màn chơi thứ \(R\), Dealer Youtuber_TWK thắng.
  • Nếu đây chưa phải màn chơi thứ \(R\), một màn chơi mới bắt đầu.
  • HP hiện tại của mỗi người chơi được giữ nguyên.
  • Mỗi người chơi được cộng thêm \(3\) HP.
  • Dealer nạp một khẩu súng mới có đúng \(L\) viên live và \(N-L\) viên blank.
  • Dealer chọn thứ tự các viên đạn của khẩu súng mới.
  • Lượt đầu tiên của màn chơi mới được xác định lại theo quy tắc người thách đấu ở dưới.

Dealer được phép chọn bất kỳ thứ tự nào cho từng khẩu súng, miễn số lượng đạn đúng quy định.

\({\qquad}\) Người thách đấu và lượt đầu

Input chứa hai tên người thách đấu theo thứ tự.

  • Nếu chỉ có hunglvh thách đấu, hunglvh được quyền chơi lượt đầu.
  • Nếu chỉ có just_coast thách đấu, just_coast được quyền chơi lượt đầu.
  • Nếu cả hai cùng thách đấu, tức input là một trong hai thứ tự:
    • HUNGLVH JUST_COAST
    • JUST_COAST HUNGLVH

thì Dealer Youtuber_TWK là bên thực hiện phát đạn đầu tiên.

Trong trường hợp cả hai cùng thách đấu, Dealer không có HP và không được tính là mục tiêu. Dealer chỉ thực hiện phát đạn đầu tiên bằng cách chọn một trong hai người chơi làm mục tiêu. Sau phát đạn đó, lượt chuyển sang người chơi còn lại nếu viên đạn là live hoặc Dealer chọn mục tiêu đối phương; nếu phát đạn là blank và mục tiêu là chính người được xác định là người chơi của lượt đó, người đó được giữ lượt.

Để tránh trường hợp không xác định, khi Dealer là bên phát đạn đầu tiên, Dealer phải tuân theo cùng quy tắc hành động:

  • Nếu \(x=0\), chọn OPPONENT
  • Nếu \(y=0\), chọn SELF
  • Nếu \(x>0\)\(y>0\), chọn SELF

Ở đây SELFOPPONENT được hiểu theo người chơi mà Dealer đang thực hiện lượt thay cho.

\({\qquad}\) Lợi thế

Sau mỗi phát bắn, communication công bố người đang có lợi thế giữa hai người chơi:

  • Nếu HP của hunglvh lớn hơn HP của just_coast, gửi HUNGLVH
  • Nếu HP của just_coast lớn hơn HP của hunglvh, gửi JUST_COAST
  • Nếu hai người có cùng HP, gửi HUNGLVH

Thông tin lợi thế chỉ là thông tin quan sát và không ảnh hưởng đến chiến thuật, lượt chơi hoặc kết quả của ván đấu.

\({\qquad}\) Kết quả cuối cùng

  • Nếu hunglvh\(0\) HP trước hoặc sau một phát bắn, just_coast thắng.
  • Nếu just_coast\(0\) HP trước hoặc sau một phát bắn, hunglvh thắng.
  • Nếu cả hai người chơi vẫn còn sống sau khi hoàn thành màn chơi thứ \(R\), Dealer Youtuber_TWK thắng.
  • Một phát bắn chỉ có một mục tiêu, do đó không thể có trường hợp cả hai người chơi cùng mất HP trong cùng một phát bắn.

Input

  • Dòng đầu tiên chứa ba số nguyên \(N,L,R\)
  • Dòng thứ hai chứa một hoặc hai chuỗi A B, là tên của hai người thách đấu theo thứ tự.
  • \(A,B\) là hai chuỗi khác nhau trong tập:
    • HUNGLVH
    • JUST_COAST
  • Mỗi tên xuất hiện đúng một lần.
  • Nếu chỉ một người thách đấu, communication sẽ sử dụng người đó làm người chơi đầu tiên.
  • Nếu cả hai cùng thách đấu, communication biểu diễn trường hợp này bằng một trong hai thứ tự HUNGLVH JUST_COAST hoặc JUST_COAST HUNGLVH và Dealer là bên phát đạn đầu tiên.
  • Thứ tự các viên đạn của khẩu súng đầu tiên không được cung cấp cho chương trình.
  • Thứ tự các viên đạn của các khẩu súng tiếp theo cũng không được cung cấp cho chương trình.

Communication

  • Ở đầu mỗi lượt của hunglvh, communication gửi bốn số nguyên a b x y, trong đó:
    • \(a\) là HP hiện tại của hunglvh
    • \(b\) là HP hiện tại của just_coast
    • \(x\) là số viên live còn lại trong khẩu súng.
    • \(y\) là số viên blank còn lại trong khẩu súng.
  • hunglvh phải in đúng một trong hai lệnh:
    • SELF
    • OPPONENT
  • Communication kiểm tra viên đạn hiện tại và trả về:
    • LIVE nếu viên đạn là live.
    • BLANK nếu viên đạn là blank.
  • Sau phát bắn, communication gửi lại trạng thái mới bằng bốn số nguyên a b x y
  • Communication gửi người đang có lợi thế bằng một trong:
    • HUNGLVH
    • JUST_COAST
  • Nếu lượt thuộc về just_coast, communication tự thực hiện hành động của just_coast theo đúng chiến thuật đã cho.
  • Sau phát bắn của just_coast, communication gửi:
    • LIVE hoặc BLANK;
    • bốn số nguyên a b x y;
    • HUNGLVH hoặc JUST_COAST
  • Nếu just_coast chọn SELF và nhận BLANK, just_coast tiếp tục lượt.
  • Trong mọi trường hợp khác, lượt chuyển về hunglvh
  • Nếu một người chơi có \(0\) HP, communication gửi kết quả cuối cùng và kết thúc.
  • Nếu khẩu súng hết đạn trong khi cả hai người chơi vẫn còn sống:
    • nếu đã hoàn thành màn chơi thứ \(R\), communication gửi YOUTUBER_TWK và kết thúc;
    • nếu chưa hoàn thành màn chơi thứ \(R\), communication cộng \(3\) HP cho mỗi người chơi, nạp khẩu súng mới và bắt đầu màn chơi tiếp theo.
  • Ở đầu một màn chơi mới, lượt được xác định theo quy tắc người thách đấu đã nêu.
  • Dealer phải đảm bảo mỗi khẩu súng có đúng \(L\) viên live và \(N-L\) viên blank.
  • Dealer được phép chọn thứ tự đạn dựa trên toàn bộ lịch sử giao tiếp.
  • Sau mỗi lần chương trình in SELF hoặc OPPONENT, chương trình phải flush output.

Constraints

  • \(2\le N\le10^6\).
  • \(1\le L<N\).
  • \(1\le R\le10^6\).
  • Cả hunglvhjust_coast bắt đầu với \(3\) HP.
  • Mỗi khẩu súng có đúng \(L\) viên live và \(N-L\) viên blank.
  • Khi bắt đầu một màn chơi mới, mỗi người chơi được cộng thêm \(3\) HP vào HP hiện tại.
  • Tổng số phát bắn trong toàn bộ ván đấu không vượt quá \(10^6\).
  • Dealer luôn tuân thủ đầy đủ giao thức và các luật của đề bài.

Example

Example 1

Input
6 3 1
HUNGLVH
Communication
3 3 3 3
SELF
LIVE
2 3 2 3
JUST_COAST

2 3 2 3
SELF
LIVE
2 2 1 3
HUNGLVH

2 2 1 3
SELF
BLANK
2 2 1 2
HUNGLVH

2 2 1 2
SELF
LIVE
1 2 0 2
JUST_COAST

1 2 0 2
OPPONENT
BLANK
1 2 0 1
JUST_COAST

1 2 0 1
SELF
BLANK
1 2 0 0
JUST_COAST

1 2 0 0
OPPONENT
LIVE
1 1 0 0
HUNGLVH

HUNGLVH
Note
  • hunglvh là người thách đấu nên được đi đầu.
  • Hai viên live đầu tiên lần lượt làm HP của hai người thành 2 - 2
  • Sau viên live thứ ba, HP thành 1 - 2, lợi thế chuyển sang just_coast
  • Viên live cuối bắn vào just_coast, đưa HP về 1 - 1
  • Khẩu súng hết đạn và cả hai còn sống, nên đây là chiến thắng của hunglvh sau màn chơi thứ R

Example 2

Input
6 3 1
JUST_COAST
Communication
3 3 3 3
SELF
LIVE
3 2 2 3
HUNGLVH

3 2 2 3
SELF
LIVE
2 2 1 3
HUNGLVH

2 2 1 3
SELF
BLANK
2 2 1 2
HUNGLVH

2 2 1 2
SELF
LIVE
2 1 0 2
JUST_COAST

2 1 0 2
OPPONENT
BLANK
2 1 0 1
JUST_COAST

2 1 0 1
SELF
BLANK
2 1 0 0
JUST_COAST

2 1 0 0
OPPONENT
LIVE
2 0 0 0
JUST_COAST

JUST_COAST
Note
  • just_coast là người thách đấu nên được đi đầu.
  • Sau hai viên live đầu, HP là 2 - 2, nên lợi thế là HUNGLVH
  • Viên live thứ ba làm HP thành 2 - 1, lợi thế chuyển sang just_coast
  • Viên live cuối hạ HP của hunglvh xuống 0
  • hunglvh0 HP, just_coast thắng.

Example 3

Input
4 2 1
HUNGLVH JUST_COAST
Communication
3 3 2 2
LIVE
2 3 1 2
JUST_COAST

2 3 1 2
SELF
BLANK
2 3 1 1
JUST_COAST

2 3 1 1
SELF
LIVE
2 2 0 1
HUNGLVH

2 2 0 1
SELF
BLANK
2 2 0 0
HUNGLVH

YOUTUBER_TWK
Note
  • Cả hai cùng thách đấu nên Dealer Youtuber_TWK phát đạn đầu tiên.
  • Dealer phải chọn SELF, tức bắn vào hunglvh
  • Sau viên live đầu, HP là 2 - 3, lợi thế là JUST_COAST
  • just_coast nhận blank nên giữ lượt.
  • Viên live tiếp theo làm HP thành 2 - 2, lợi thế chuyển về HUNGLVH
  • Khẩu súng hết đạn, cả hai còn sống nên Dealer thắng.

Scoring

  • Subtask 1 (20%): \(N\le10^4\), \(R\le10^4\)
  • Subtask 2 (30%): \(N\le10^5\), \(R\le10^5\)
  • Subtask 3 (50%): Không ràng buộc gì thêm.

Bình luận (5)

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