zoukankan      html  css  js  c++  java
  • POJ 2368 巴什博奕

    题目大意:给出n个按钮,每次最多可以按L个,按下最后一个按钮的人获胜。求使后手必定获胜的L的最小值(L>=2)。

    题目思路:

    巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
    显然,如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果n=(m+1)r+s,(r为任意自然数,s≤m),那么先取者要拿走s个物品,如果后取者拿走k(≤m)个,那么先取者再拿走m+1-k个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
    公式:n%(m+1)!=0 则先手胜,否则后手胜
     
    变形:
    对于巴什博弈,那么我们规定,如果最后取光者输,那么又会如何呢?
    (n-1)%(m+1)==0则后手胜利。
     
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stdio.h>
    #include<stdlib.h>
    #include<queue>
    #include<math.h>
    #include<map>
    #define INF 0x3f3f3f3f
    #define MAX 1005
    #define Temp 1000000000
    #define MOD 1000000007
    
    using namespace std;
    
    int main()
    {
        int n,i,minn;
        while(scanf("%d",&n)!=EOF)
        {
            minn=n;
            for(i=2;i*i<=n;i++)
            {
                if(n%i==0 && i>2)
                    minn=min(minn,i);
                if(n%i==0 && n/i>2)
                    minn=min(minn,n/i);
            }
            if(minn >2)
                printf("%d
    ",minn-1);
            else
                printf("0
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Java事务
    Mybatis二级缓存问题
    183.面试题 17.14. 最小K个数(快速排序)
    182. 跟着三叶学最短路径问题(存图方式)
    181. 差分数组学习
    AI大视觉(二十) | 小目标检测的tricks汇总
    CentOS7 上安装 mysql-5.7.26
    如何欺骗 Go Mod?
    .netcore docker常用命令-持续补充
    转载:登录后,用户配置被修改的处理方法
  • 原文地址:https://www.cnblogs.com/alan-W/p/5949607.html
Copyright © 2011-2022 走看看