1 条题解

  • 0
    @ 2024-3-21 14:04:54

    C++ :

    #include <iostream>
    #include <deque> //用双端队列最方便
    using namespace std;
    
    // 已知
    deque<int> d;
    int a, b, c;
    // 未知
    int x, front;
    void input()
    {
        d.resize(8);
        for (int i = 0; i < 4; ++i)
        {
            cin >> d[i];
            d[i + 4] = d[i]; // 上来就给他double一下,表示撕好
        }
        cin >> a >> b >> c;
    }
    void output(int n)
    {
        cout << "step " << n << ':';
        for (auto i : d)
        {
            cout << i << ' ';
        }
        cout << endl;
    }
    void move(int x = 0)
    {
        front = d.front();
        d.pop_front();
        if (x)
        {
            d.emplace(d.begin() + d.size() / 2, front); // 压到中间
        }
        else
        {
            d.push_back(front); // 压到最后
        }
    }
    void opt()
    {
        // 操作1
        output(1);
        // 操作2
        for (int i = 0; i < a; ++i)
        {
            move(); // 压到最后a次就是拿a张压到后面
        }
        output(2);
        // 操作3
        for (int i = 0; i < 3; ++i)
        {
            move(1); // 拿三张插到中间
        }
        output(3);
        // 操作4
        x = d.front(); // 藏牌
        d.pop_front(); // ban掉
        output(4);
        // 操作5
        for (int i = 0; i < b; ++i)
        {
            move(1);
        }
        output(5);
        // 操作6
        if (c == 1) d.pop_front(); // 男生丢1张
        else if (c == 2) d.pop_front(), d.pop_front(); // 女生丢2张
        output(6);
        // 操作7
        for (int i = 0; i < 7; ++i)
        {
            move(); // 移动7次
        }
        output(7);
        // 操作8
        while (d.size() > 1)
        {
            move();        // 把快乐留下来
            d.pop_front(); // 把烦恼丢掉
            output(8);
        }
    }
    
    int main()
    {
        input();
        opt();
        cout << x << ' ' << d[0] << endl;
        return 0;
    }
    

    信息

    ID
    2868
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    (无)
    递交数
    0
    已通过
    0
    上传者