QOJ.ac

QOJ

时间限制: 1 s 内存限制: 128 MB 总分: 100 交互

#13306. 拍卖

统计

Alojzy 和 Bajtazar 正在玩一场竞拍游戏。游戏需要用到大量的棋子。玩家轮流进行操作:先是 Alojzy,然后是 Bajtazar,接着又是 Alojzy,以此类推。在游戏的任何时刻,有两个数值至关重要:当前的下注额和当前堆叠的棋子总数。游戏开始时,下注额为 1 枚棋子,堆叠为空。在每一轮中,玩家可以执行以下操作之一:

  • 将下注额翻倍,
  • 将下注额变为原来的三倍,
  • 弃权(pass)。

如果玩家选择弃权,当前的全部下注额将移至堆叠中(这是增加堆叠棋子数量的唯一方式),竞拍重新从 1 枚棋子的下注额开始。如果玩家弃权,则下一轮由其对手进行(只有游戏开始时由 Alojzy 先手)。导致堆叠溢出的玩家(即当堆叠中的棋子达到 $n$ 枚或更多时)即为输家。如果在玩家操作前,堆叠中的棋子总数与当前下注额之和达到或超过 $n$,则该玩家不能再将下注额翻倍或变为三倍。他必须弃权,从而将下注额加入堆叠,导致其输掉比赛。

Alojzy 经常输掉比赛。Bajtazar 向他提出了一个有趣的挑战——与其亲自玩竞拍游戏,不如编写程序来玩。遗憾的是,Alojzy 不会编程。请帮助他!

请编写一个程序,代表 Alojzy 与 Bajtazar 编写的库进行竞拍游戏。

子任务

在所有测试用例中,你的程序只要执行正确的操作,就能够战胜库,无论库如何操作。只有当你战胜了库时,你的程序才能在该测试中获得分数。

在所有测试中,满足条件 $1 \leqslant n \leqslant 30\,000$。在 50% 的测试用例中,满足额外条件 $n \leqslant 25$。

交互

为了使用库,必须在程序开头包含:

  • C/C++: #include "cliclib.h"
  • Pascal: uses pliclib;

库提供了以下函数和过程:

  • inicjuj — 返回数字 $n$。该函数应在程序开始时恰好调用一次。
    • C/C++: int inicjuj();
    • Pascal: function inicjuj: longint;
  • alojzy — 通知库你的程序所做的操作。其唯一参数是一个整数 $x$,表示所做的操作:$x = 1$ 表示弃权,$x = 2$ 表示将下注额翻倍,$x = 3$ 表示将下注额变为三倍。
    • C/C++: void alojzy(int x);
    • Pascal: procedure alojzy(x: longint);
  • bajtazar — 该函数通知你的程序库所做的操作。它返回一个整数 $x$,表示所做的操作。与 alojzy 函数类似,$x = 1$ 表示弃权,$x = 2$ 表示翻倍,$x = 3$ 表示将下注额变为三倍。
    • C/C++: int bajtazar();
    • Pascal: function bajtazar: longint;

调用 inicjuj 函数后,必须交替调用 alojzybajtazar 函数(按此顺序)。违反通信协议将被视为错误回答,并导致该测试得 0 分。在本题中,禁止使用标准输入输出。任何通信都应仅通过上述函数和过程进行。库将在游戏结束后自动终止程序。

样例

C/C++ Pascal 结果 堆叠 下注额 说明
n = inicjuj(); n := inicjuj; $15$ $0$ $1$ 从此刻起 $n = 15$。
alojzy(2); alojzy(2); $0$ $2$ 你的程序将下注额翻倍。
bajtazar(); bajtazar; $2$ $0$ $4$ 库回应了翻倍操作。
alojzy(3); alojzy(3); $0$ $12$ 你的程序将下注额变为三倍。
bajtazar(); bajtazar; $1$ $12$ $1$ 库弃权。12 枚棋子进入堆叠,下注额重新变为 1。
alojzy(2); alojzy(2); $12$ $2$ 你的程序将下注额翻倍。
bajtazar(); bajtazar; $3$ $12$ $6$ 库将下注额变为三倍。
alojzy(1); alojzy(1); $18$ $1$ 堆叠与下注额之和超过了 15。你的程序被迫弃权。

上述程序运行过程是正确的,但不是最优的。你的程序将不会在该测试中获得分数。特别地,对于 $n = 15$,Alojzy 有可能获胜,无论 Bajtazar 如何操作。

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.