AT_rco_contest_2019_final_a めくってそろえる

题目描述

**这道题是一个交互式问题。** X非常喜欢玩记忆卡片游戏和长跑。有一天,他决定将这两者结合,创造出一个全新的游戏。 游戏中有一大堆卡片,每张卡片上写有一个从 $1$ 到 $\lfloor N/2 \rfloor$ 的整数。所有卡片被随机打乱后背面朝上堆成 $N$ 堆。 这些卡片堆从左到右依次编号为 $0, 1, \cdots, N-1$。 X可以在卡片堆上移动,当他发现连续两张打开的卡片数值相同时,可以将它们配对移除,并获得相应的分数。 游戏开始时,X在卡片堆 $0$ 的上方,初始分数为 $0$。 在不超过总移动距离 $T$ 的限制下,X可以反复执行以下步骤: - 假设当前所在的卡片堆编号为 $p$。 - 若当前卡片堆 $p$ 的顶部卡片是正面朝上的,记该整数为 $a_p$。(第一次操作和配对移除卡片后的移动除外,此时顶部卡片是背面朝上的。) - 选择一个目标卡片堆编号 $q (0 \leq q \leq N-1)$,并从 $p$ 移动到 $q$(允许 $q = p$)。这次移动消耗的距离为 $|p - q|$。 - 翻转目标卡片堆 $q$ 顶部的卡片,记其上的整数为 $a_q$。 - 若两张翻开的卡片数值相等,则将它们配对移除,并获得对应的分数。即当 $p \neq q$ 且 $a_p = a_q$ 时,从 $p$ 和 $q$ 各移除一张卡片,并将分数增加 $a_p$。移除卡片后,卡片堆的顶部会出现新的背面朝上的卡片。 - 如果匹配失败(即 $a_p \neq a_q$),先前翻开的卡片会再次翻回背面朝上。 目标是让X尽可能多地得分。 测试用例的评分以及最终总分如下: - 每个测试用例中,X获得的总分就是该测试用例的分数。 - 总共有 $50$ 个测试用例。所有测试用例得分的总和构成这道题的总分。 ### 输入格式 首先从标准输入读取: ``` N T ``` - $N$ 是卡片堆的数量,$N = 50$。 - $T$ 是允许的总移动距离,$T = 10000$。 - **请务必读取标准输入的信息。** 接下来是与评测程序的交互过程: 1. 向标准输出输出一个整数: ``` q ``` - 若要移动X,输出目标卡片堆的编号 $(0 \leq q \leq N-1)$。 - 若要结束游戏,输出 `-1` 并退出程序。 - **若超出允许的总移动距离,将导致答案错误。** - **输出后必须换行并刷新缓冲区。** 2. 若 $q \neq -1$,则需从标准输入读取一个整数: ``` a_q ``` - $a_q$ 表示卡片堆 $q$ 顶部卡片上的整数 $(1 \leq a_q \leq N/2)$。 - **请务必读取标准输入的信息。** ### 测试用例示例 以下是游戏流程的一个示例: ``` 4 6 ``` 这表示有4个卡片堆,总移动距离为6。 - X首先位于卡片堆0: ``` 0 ``` 当前不需要移动,顶部卡片翻开。 - 卡片堆0的顶部卡片数值为`1`: - 移动到卡片堆2需要消耗2距离: - 卡片堆2顶部卡片是`2`,这时未能配对成功,因此卡片堆0的卡片翻回背面。 - 移动到卡片堆1消耗1距离: - 卡片堆1顶部卡片是`2`,成功配对并移除,同时获2分。 - 继续翻开卡片堆1顶部反面卡片。 - 卡片堆1顶部卡片还是`2`。 - 移动到卡片堆2消耗1距离: - 卡片堆2顶部卡片是`1`: ... (依此类推,继续移动和翻卡片) - 使用指令 ``` -1 ``` 结束游戏以避免超过最大允许移动距离。 **本翻译由 AI 自动生成**

输入格式

输出格式

说明/提示

### テストケースの生成について 各カードに書かれた整数は一様乱数にしたがって生成されます。 ### 入出力例 プログラムへの入力 プログラムの出力 説明 山札の情報 移動 総距離 スコア ``` 4 6 ``` 山札が4個あり、移動可能な総距離が6であることを表します。 このサンプルは制約 \\(N=50\\) および \\(T=10000\\) を満たしていません。 `? ? ? ?` 0 0 ``` 0 ``` 山札0に移動して一番上のカードを表向きにします。 最初にXは山札0の上にいるので、移動距離は0です。 `? ? ? ?` 0 0 ``` 1 ``` 山札0の一番上には`1`と書かれたカードがあります。 `1 ? ? ?` 0 0 ``` 2 ``` 山札2に移動します。山札0から山札2への移動距離は2です。 `1 ? ? ?` 2 0 ``` 2 ``` 山札2の一番上には`2`と書かれたカードがあります。 \\(a\_0 \\neq a\_2\\) なので、先に表向きにした山札0の一番上のカードは裏向きになります。 `1 ? 2 ?` ↓ `? ? 2 ?` 2 0 ``` 1 ``` 山札1に移動します。山札2から山札1への移動距離は1です。 `? ? 2 ?` 3 0 ``` 2 ``` 山札1の一番上には2と書かれたカードがあります。 \\(a\_1 = a\_2 = 2\\) なので、山札1,2からカードを取り除き、スコアを2点獲得します。 山札1, 2からカードを取り除いたことで、それぞれの山札の一番上にあるカードは再度表向きにしないと分かりません。 `? 2 2 ?` ↓ `? ? ? ?` 3 2 ``` 1 ``` 今いる山札1の一番上のカードを表向きにします。 `? ? ? ?` 3 2 ``` 2 ``` 山札1の一番上には2と書かれたカードがあります。 先ほどと同じ整数が出ることもあります。 `? 2 ? ?` 3 2 ``` 2 ``` 山札1から山札2へ移動します。 `? 2 ? ?` 4 2 ``` 1 ``` 山札2の一番上には1と書かれたカードがあります。 `? 2 1 ?` ↓ `? ? 1 ?` 4 2 ``` 0 ``` 山札2から山札0へ移動します。 `? ? 1 ?` 6 2 ``` 1 ``` 山札0の一番上には(一度表向きにしたことからすでに判明しているように)1と書かれたカードがあり、条件を満たすのでペアで取り除いてスコアを1点獲得します。 `1 ? 1 ?` ↓ `? ? ? ?` 6 3 ``` -1 ``` ゲームを終了します。さらに移動しようとすると、移動可能な総距離を超えてしまいWrong Answer扱いとなります。 `? ? ? ?` 6 3### テスター 次のリンクから提供しています。 [テスター](https://github.com/recruit-communications/rco-contest-2019/tree/master/final_A/tester)