• nyojb 2359 巴什博弈变形


    http://acm.nyist.me/JudgeOnline/problem.php?id=2359

    2359: 巴什博弈?

    时间限制: 1 Sec  内存限制: 30 MB
    提交: 237  解决: 43
    [提交][状态][讨论版]

    题目描述

    有n个石子,有两人轮流从中取石子,最少a个最多b个,谁没得取(即当轮到他取是已经没有石子可以取了,也就是说此时石子数量小于a)谁赢,现在,LLM先取,问你LLM能赢吗

    输入

    每个测试样例少于100000组测试数据

    每组测试样例第一行三个整数n,a,b

    1<=a<=b,n<=100000000

    输出

    如果LLM能赢,输出YES,否则输出NO

    样例输入

    1 1 1
    2 1 2
    

    样例输出

    NO
    YES
    

    几乎从未做过博弈的题目,只是上学期写过两道模板题,这种题目就是找到必败态/必胜态,这道题目要求只要轮到你取且石子数<a那么你就是胜利者,那么到最后遇到什么数量的石子必然会输呢,
    答案是[a,2*a),因为无论怎样取剩余的石子一定小于a(最小是0),那么对手必然会胜利,所以这是一个必败态,令x(-[a,2*a),那么x+(a+b)*k也是必败态,无论你取走多少只要对手取走a+b-i,
    最后面临x的人必然是你,所以必败,那我们就可以根据这个范围来讨论了,
    当a<=n%(a+b)<2*a时候必败;
    n%(a+b)<a的时候,先手只要取走一个b,那么对手剩下的就是(a+b)*(k-1)+(x+a),由于x<a所以a<=x+a<2*a转化为了必败态。
    当a+b>n%(a+b)>2*a的时候,因为n%(a+b)-a<b,我们可以取走n%(a+b)-a个给对手剩下 a+(a+b)*k,又是必败态。
    巧妙地数学,虽然每次数学题都是一脸懵逼- -
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 int main()
     5 {
     6     int n,i,j,a,b;
     7     while(scanf("%d%d%d",&n,&a,&b)==3){
     8         int t=n%(a+b);
     9         if(t<a) puts("YES");
    10         else if(t<2*a) puts("NO");
    11         else puts("YES");
    12     }
    13     return 0;
    14 }
     
  • 相关阅读:
    poj 1475 Pushing Boxes 推箱子(双bfs)
    poj 1806 Frequent values(RMQ 统计次数) 详细讲解
    poj 2846 Repository
    poj Ping pong LA 4329 (树状数组统计数目)
    POJ 1962-Corporative Network (并查集)
    hdu 2217 Visit
    nyoj304 节能
    与R纠缠的两件事——rownames和子集--转载
    七步精通Python机器学习--转载
    win10专业版激活(亲测可用)
  • 原文地址:https://www.cnblogs.com/zzqc/p/7464878.html
Copyright © 2020-2023  润新知