1 条题解

  • 0
    @ 2025-8-24 21:45:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 姬小野
    **

    搬运于2025-08-24 21:45:49,当前版本为作者最后更新于2018-08-15 22:05:15,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这道题是洛谷博弈论专题的第一道入门题, 然而刚开始我是不会做的, 毕竟是道入门题, 我博弈论还没入门呢.

    这道题的做法就是: 如果m为偶数, 那么先手赢(即pb), 如果m为奇数, 那么后手赢(即zs).

    做法很简单, 可是我们要知道怎么做的

    说实话我对于他们两个都聪明绝顶, 都会按照最优策略来走很不感冒. 既然他们聪明绝顶, 那么先手明知道m为奇数时自己会输, 为什么不洒脱一点走呢? 也许乱走出奇迹?

    那我们来试试看. 当m = 13时, 先手为什么会输. 前提是先手知道自己按照最优策略会输(因为轮到他分时为奇数), 所以开始乱走.

    先手:13 = 4 +9
    后手:选4, 4 = 1 +3
    先手:不得已选3, 3=1+2
    后手:选2,2=1+1
    后手赢
    

    不服? 再来一把

    先手:13=6+7
    后手:选6,6=1+5
    先手:选5,5=1+4
    后手:选4,4=1+3
    先手:3=1+2
    后手:2=1+1
    后手赢
    

    经过了两把测试, 我们不管先手怎么走(乱走或所谓最优策略),只要他手里是奇数,都不得不拆成奇数+偶数, 那么后手只要选择偶数, 他就可以把这个数化成m = n + 1(后手的最优策略), 把奇数转移给先手. 这样经过若干次转移之后, 后手手里一定会是2,然后2 = 1 + 1, 后手就赢了.

    所以, 其实手里是奇数的人是没有胜算的, 所以这个状态是必败态. 而手里是偶数的人是有必胜的可能的, 只有他才有最优策略而且只要他按照最优策略走, 他一定会赢, 因此这个状态是必胜态. 当然, 如果他sa, 就可能将必胜态拱手让人.

    而理解这个博弈论问题的关键, 就是拥有偶数的策略: 每次减一. 因而可以再次将偶数态(必胜态)转移过来.

    事实上, 刚接触此题时, 我对所谓绝顶聪明, 所谓最优策略很困惑, 两个人博弈, 凭什么说我走的是最佳策略结果却输了? 我是不是应该把所有走法都试一遍, 然后都输给你才算我输?

    我的理解是: 必败态从来没有最佳策略, 博弈也不是双方的博弈, 而是处在必胜态的那方和自己博弈. 而这场博弈, 由于绝顶聪明的前提, 是必胜的, 而我们要做的, 只是找出谁有跟自己博弈的机会.

    此题入门, 然颇有感触, 大佬轻喷.

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int n, x;
    	cin >> n;
    	while (n--) {
    		cin >> x;
    		if (x & 1) cout << "zs wins" << endl;
    		else cout << "pb wins" << endl;
    	}
    }
    
    • 1

    信息

    ID
    2219
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者