Codeforces 1137D - Cooperative Game - [交互題+思惟題]

題目連接:https://codeforces.com/contest/1137/problem/Dios

 

題意:c++

交互題。spa

給定以下一個有向圖:code

如今十我的各有一枚棋子(編號 $0 \sim 9$),在不知道 $t,c$ 的值的狀況下,他們同時從home出發,要最終到達flag處。blog

你只能選擇移動哪幾我的的棋子,但棋子移動到哪裏由程序肯定並給出。ci

 

題解:get

看網上大佬一個神仙解法……看得我一愣一愣的……input

選定兩顆棋子,第一顆每次都移動,第二顆隔一次移動一次。因此,進行了 $2t$ 次以後第二顆棋子恰好到達終點,string

這個時候,第一顆棋子至關於以flag點爲起點,移動了 $t$ 次,那麼它此時的位置就至關於從flag出發走了 $t \bmod c$ 次,也就是說取flag處爲 $0$ 位置,那麼它如今在 $t \bmod c$ 位置。it

那麼,此時第一顆棋子想要追第二顆棋子的話,他們之間的距離是 $c - (t \bmod c)$,所以還要在移動 $2 \times [c - (t \bmod c)]$ 次才能讓兩顆棋子處於同一個位置。

那麼這個位置在哪裏呢?咱們能夠這麼算,第一顆棋子從flag出發先走了 $t \bmod c$ 次,又走了 $2 \times [c - (t \bmod c)]$ 次,即總的走了 $2c - (t \bmod c)$ 次,即在 $2c - (t \bmod c)$ 位置,對 $c$ 取模即至關於在 $c - (t \bmod c)$ 位置。

此時,對於所有的棋子,只須要同時每一個都再走 $t$ 步,就能所有到達flag點。

這樣一來,只需作 $2t + 2 [c - (t \bmod c)] + t \le 3t + 2c < 3(t+c)$ 次就能完成了。

 

AC代碼:

#include<bits/stdc++.h>
using namespace std;
inline int input()
{
    int k; cin>>k;
    string s;
    for(int i=1;i<=k;i++) cin>>s;
    return k;
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    while(1)
    {
        cout<<"next 0"<<endl;
        input();
        cout<<"next 0 1"<<endl;
        if(input()==2) break;
    }
    while(1)
    {
        cout<<"next 0 1 2 3 4 5 6 7 8 9"<<endl;
        if(input()==1) break;
    }
    cout<<"done"<<endl;
}
相關文章
相關標籤/搜索