题解 CF1137D 【Cooperative Game】
xzyxzy
2019-03-11 19:46:35
## [BLOG](https://www.cnblogs.com/xzyxzy/p/10512730.html)
# [Codeforces1137D]Cooperative Game
Tags:题解
---
## 题意
这是一道交互题。
给你一张下面这样的地图,由一条长为$t$的有向链和一个长为$c$的环构成。
![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1137D/34a9ab7816c73b7f2368756224775ddf156360e3.png)
现在你有$10$颗棋子,编号$0$到$9$,你不知道$t$和$c$的值,你每次可以移动若干颗棋子。
请你输出方案,使得所有棋子走到环和链的交点处,并在走到时输出`done`。
你每次可以输出`next a b c ...`,交互库将返回`k a1 a2 ... ak`表示当前有$k$个位置有棋子,$ai$表示一个字符串,表示第$i$个位置的棋子编号是什么。
你的移动次数不能超过$3(t+c)$,$t+c\le 1000$。
## 题解
神仙题,一直在想$10$颗棋子的二进制意义,然而$t$和$c$再大也没有关系。
步骤:
选定两颗棋子$0$,$1$,$0$每次都移动,$1$每两次移动一次。
走了$2t$步之后$1$刚好到达交点$T$,把环按照以$T$为$1$按边的方向依次编号,则此时$0$在环上的$t$位置。
这时$0$还需要$c-t$步追上~~(到)~~ $1$,追上的位置是$c-t$。
然后惊奇地发现:把所有点同时走$t$步就可以让所有点都在$T$上了!
服了服了。这场掉分掉得爽啊(第一次掉分)
## 代码
```cpp
#include<iostream>
using namespace std;
char s[100];
int In() {int x,p;scanf("%d",&x);for(p=x;p;p--) scanf("%s",s);return x;}
int main()
{
while(1)
{
puts("next 0");fflush(stdout);In();
puts("next 0 1");fflush(stdout);
if(In()==2) break;
}
while(1)
{
puts("next 0 1 2 3 4 5 6 7 8 9");
fflush(stdout);if(In()==1) break;
}
puts("done");fflush(stdout);
}
```