CF 1138F 超级有意思的一道交互题QVQ

题意

有一张有向图,由一条长度为 T 的链和一个长度为 C 环组成,但是你并不知道 T 和 C 是多少

图的出发点在链的一段,终点在链的另一端,同时终点与一个环相连,大概有点内向树感觉

内向树?

现在有 10 个人,你可以每次操作让一些人沿着路径前进一步,然后交互库会返回你多少个点上有人以及上面的人分别是谁(其实是谁可能不重要?)

你的目标就是在 \(3*(T+C)\) 次操作内让所有人同时到达终点,然后输出 done

分析

其实很好做?

我们只要首先 重复让 0 号走一步,然后 0 号 1 号一起走一步,直到 0 1 相遇(也就是返回有 2 个点上有人)

不难看出此时 0 1 一定在环上,然后我们让 10 个人一起走,等他们所有人相遇,就是走到终点了

什么?为什么这么做是对的?

我们设 1 走了 \(T + x\) 步后和 0 相遇 ,那么 0 就走了 \(2*(T + x)\) (T 就是链长)

那么 \(T+x\) 必然是 \(C\) 的倍数,因为 0 1 相遇, 0 肯定在环上多走了几圈

于是 1 号点再走 T 步就能到终点了, 0 和 1 一起走的,看做一个点就好了

而其他所有的点走了 T 步之后也到终点了

虽然我们不知道 T 是多少,但是让他们走着就对了(反正相遇了就是到终点了)

关于交互的问题

首先就是不知道能不能用文件读入...(好像不行,亲测出锅了)

然后就是记得 fflush

当然用 cout + endl 的好像连 fflush 都可以省掉不用了QVQ

//by Judge
#include<bits/stdc++.h>
using namespace std;
inline int read(){ int x=0; char c=getchar();
    for(;!isdigit(c);c=getchar());
    for(;isdigit(c);c=getchar()) x=x*10+c-'0'; return x;
} char s[15];
inline int get(){ int x=read();
    for(int i=1,t;i<=x;++i) scanf("%s",s); return x;
}
int main(){
    while(1){
        puts("next 0"),fflush(stdout),get();
        puts("next 0 1"),fflush(stdout);
        if(get()==2) break;
    }
    while(1){
        puts("next 0 1 2 3 4 5 6 7 8 9"),fflush(stdout);
        if(get()==1) break;
    } return puts("done"),fflush(stdout),0;
}

转载于:https://www.cnblogs.com/Judge/p/10535377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值