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