AT_kupc2014_g Darkroom

题目描述

[problemUrl]: https://atcoder.jp/contests/kupc2014/tasks/kupc2014_g 本题为交互式题目。也就是说,你需要与评测程序进行一个游戏。 你的程序首先会输入两个整数 $N$ 和 $D$。随后,你需要输出一个长度为 $N$ 的 0/1 序列。接着,评测程序会将两位小人,京子和结衣,放置在该序列上的某两个位置。设京子的位置为 $i$,结衣的位置为 $j$。并且,京子和结衣的位置始终相距 $D$(即 $|i-j|=D$)。你始终可以知道两人当前位置上的字符。 在此条件下,你需要与评测程序进行一个确定京子和结衣位置关系的游戏。你可以向评测程序发送指令,每次可以让京子或结衣向左或向右移动一格。两人的初始位置距离序列两端足够远,因此不需要考虑移动后有人越界的情况。最后,你需要确定两人的位置关系,即 $i

输入格式

首先输入如下格式: ``` N D ``` $N$ 表示你需要输出的 0/1 序列的长度。$D$ 表示两人初始位置的间隔。 在输入后,你需要输出一个长度为 $N$ 的 0/1 序列。当你输出完序列后,评测程序会确定两人的初始位置,并返回京子和结衣当前位置上的字符。例如,如果你输出长度为 3 的 0/1 序列 "011",则: ```c printf("011\n"); fflush(stdout); ``` 接下来, ```c scanf("%d %d", &a, &b); ``` 变量 $a$ 和 $b$ 分别为京子和结衣当前位置上的字符。 之后,你可以让京子或结衣向左或向右移动,每次移动后会返回两人当前位置上的字符。例如,若让京子向右移动: ```c printf("Move(A,1)\n"); fflush(stdout); ``` 然后, ```c scanf("%d %d", &a, &b); ``` $a$ 和 $b$ 分别为两人当前位置上的字符。若让结衣向左移动: ```c printf("Move(B,-1)\n"); fflush(stdout); ``` 然后, ```c scanf("%d %d", &a, &b); ``` $a$ 和 $b$ 分别为两人当前位置上的字符。 你可以发送的指令有以下 6 种: * `Move(A,1)` — 让京子向右移动一格 * `Move(A,-1)` — 让京子向左移动一格 * `Move(B,1)` — 让结衣向右移动一格 * `Move(B,-1)` — 让结衣向左移动一格 * `ij$ 指令中不得包含空格。

输出格式

无特殊格式要求,详见题目描述。

说明/提示

# 约束条件 * $10000 \leq N \leq 100000$ * $1 \leq D \leq N-1$ * 所有输入值均为整数。 * 指令总次数(包括最终关系判断)不得超过 50 次。 * 两人的初始位置距离序列两端足够远,无需考虑越界。 * 本题时间限制为 6 秒,其中最多约 2 秒用于评测程序确定初始位置。 --- # 评分方式 本题得分根据你在所有测试数据中使用的最大指令次数 $C$ 计算: * 若 $C \leq 5$,得 900 分。 * 若 $C > 5$,得分为 $900 / (C-4)$。 --- # 输入输出样例 ``` 说明 程序输出 程序输入 输入你需要输出的 0/1 序列长度和两人间隔 10000 100 输出长度为 10000 的 0/1 序列 010101 … 010101 返回京子和结衣当前位置上的字符 0 1 让京子向右移动一格 Move(A,1) 返回京子和结衣当前位置上的字符 1 1 让结衣向左移动一格 Move(B,-1) 返回京子和结衣当前位置上的字符 1 0 确定京子的初始位置在结衣左侧 i