Codeforces Round 1048 A

逆向思维有时真的很重要

alt

这道题因为初始时两人数量一样,因此并不需要作区分,因为题目保障有解所以肯定有且仅有一个解。所以我们直接从末状态开始看。一个人是x个,另一个就是n-x个。我们只需要一直操作,直到他们相等即可。

  • 我们因为是倒序操作,因此最好用stack(LIFO)的特性储存操作;
  • 每次操作让两个数中较小的那个翻倍即可;
    int x = (int)pow(2, n), y = (int)pow(2, n);
    stack<int> sk;
    int t = x * 2;
    int fin_1 = m, fin_2 = t - m, cut = 0;
    while (fin_1 != fin_2)
    {
        if (fin_1 < fin_2)
        {
            cut++;
            fin_2 -= fin_1;
            fin_1 = fin_1 * 2;
            sk.push(1);
        }
        else
        {
            cut++;
            fin_1 -= fin_2;
            fin_2 *= 2;
            sk.push(2);
        }
    }
    cout << cut << endl;
    while (!sk.empty())
    {
        cout << sk.top() << " ";
        sk.pop();
    }
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务