QOJ.ac

QOJ

Límite de tiempo: 1.0 s Límite de memoria: 256 MB Puntuación total: 100 Interactivo Hackeable ✓

#9178. 自助餐

Estadísticas

这是一个交互式问题。

在一家自助回转寿司餐厅里,餐点被放置在移动的传送带上。顾客坐在传送带旁,餐点会依次经过。当餐点经过时,你可以选择取走它,且可以重复此操作任意多次。这听起来很划算,但也很容易因为吃得太多而感到不适。

具体来说,当你坐下后,餐点 $1, 2, \dots, n$ 会依次经过。在看到第 $i$ 个餐点后,你判断其热量值为 $a_i$。

在某家特定的餐厅里,有两种座位:

  • 面向传送带移动方向的反方向:在这种情况下,你可以看到未来所有会经过你面前的餐点,因此可以据此规划你的选择(假设餐厅里没有其他顾客)。
  • 面向传送带的移动方向:在这种情况下,你一次只能看到一个餐点:当第 $i$ 个餐点在你面前时,你必须决定是否要取走它,而不知道后续餐点的热量值。一旦第 $i+1$ 个餐点经过,第 $i$ 个餐点就太远而无法取到了。

因此,当面向传送带移动方向时,优化你的午餐选择会更困难。不过,你想到一个不道德的“黑客”手段:你可以通过悄悄地将已选餐点滑到其他顾客的桌子上,来丢弃它们。

为了防止过量进食,你为自己设定了以下规则:

  • 你面向传送带的移动方向。
  • 一旦你开始进食,你就不能再从传送带上取走任何新餐点。
  • 在任何时候,你桌上餐点的总热量值不得超过 $1000$。

现在你面临一个相反的问题——你担心如果遵循所有规则,你会饿着肚子离开餐厅。你决定,只要你吃掉的餐点总热量值至少是你面向相反方向但仍遵循其他规则时所能获得热量的 $60\%$,你就会感到满意。

更正式地说,令 $x$ 为 $a_1, a_2, \dots, a_n$ 的子序列中总和不超过 $1000$ 的最大可能值。如果你吃掉的餐点总热量值至少为 $0.6x$,你就会感到满意。

实现一个确保你总是感到满意的策略。交互器是自适应的,这意味着热量值序列不一定预先确定:它可能取决于你的程序所做的选择。

输入格式

第一行包含一个整数 $t$ ($1 \le t \le 10^4$),表示测试用例的数量。

交互

你的程序与评测程序之间的交互始于读取一个整数 $n$ ($1 \le n \le 10^4$),表示将经过的餐点数量。

接下来会进行 $n$ 次以下操作:

  • 从输入中读取一个整数 $a_i$ ($0 \le a_i \le 1000$),表示第 $i$ 个餐点的热量值。
  • 打印一行格式为 $k \ t_1 \ t_2 \ \dots \ t_k$ 的内容($0 \le k \le i, 1 \le t_j \le i$),表示你想要丢弃索引为 $t_1, t_2, \dots, t_k$ 的餐点。此时所有这些餐点必须都在你的桌上。
  • 打印一行包含单词 “TAKE”(如果你想把第 $i$ 个餐点加到你的桌上)或 “IGNORE”(如果你想让它留在传送带上)。无论哪种情况,单词都必须在没有引号的情况下打印。

在第 $n$ 次迭代后,你桌上餐点的热量总和必须至少为 $0.6x$,其中 $x$ 定义如上。

保证所有测试用例的 $n$ 之和不超过 $10^4$。

如果你的程序在任何时候进行了无效查询(例如,打印的行不符合输入规范、桌上总热量超过 $1000$、尝试丢弃不在桌上的餐点,或者测试用例结束时你没有感到满意),交互器将立即终止。如果你的程序在终止后继续读取输入,可能会收到任意判决,因为它将继续从关闭的流中读取。为防止这种情况,请始终检查输入流是否仍然打开,即不要写:

int ai;
cin >> ai;

而应写:

int ai;
if (!(cin >> ai))
    exit(0);

这样可以在交互器终止时立即终止你的程序。通过这种方式,如果你进行了无效查询,你将收到 Wrong Answer。

打印查询后,不要忘记输出换行并刷新输出。为此,请使用:

  • C++ 中的 fflush(stdout)cout.flush()
  • Python 中的 stdout.flush()

样例

输入格式 1

1
5
10
13
450
585
465

输出格式 1

0
TAKE
0
TAKE
0
TAKE
2 1 3
TAKE
0
IGNORE

说明

示例部分展示了你的程序与评测程序之间的一种可能交互。在第三个餐点之后,你的桌上有餐点 $1, 2, 3$,热量值分别为 $10, 13$ 和 $450$。当第四个餐点到来时,如果你想取走它,你必须丢弃一些餐点,因为 $10 + 13 + 450 + 585 = 1058 > 1000$。在此示例中,你的程序决定丢弃餐点 $1$ 和 $3$,因此之后你桌上的总热量为 $598$。你还忽略了最后一个餐点。

在过程结束时,你桌上的总热量值为 $598$。如果你面向相反方向,你最多可以获得 $10 + 13 + 450 + 465 = 938$。由于 $\frac{598}{938} \approx 0.637 > 0.6$,这是一个有效的解。

说明

示例部分展示了你的程序与评测程序之间的一种可能交互。在第三个餐点之后,你的桌上有餐点 $1, 2, 3$,热量值分别为 $10, 13$ 和 $450$。当第四个餐点到来时,如果你想取走它,你必须丢弃一些餐点,因为 $10 + 13 + 450 + 585 = 1058 > 1000$。在此示例中,你的程序决定丢弃餐点 $1$ 和 $3$,因此之后你桌上的总热量为 $598$。你还忽略了最后一个餐点。

在过程结束时,你桌上的总热量值为 $598$。如果你面向相反方向,你最多可以获得 $10 + 13 + 450 + 465 = 938$。由于 $\frac{598}{938} \approx 0.637 > 0.6$,这是一个有效的解。

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.