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
  • 相关阅读:
    Linux学习——在虚拟机上的Linux进行磁盘分区
    Linux命令学习3——用户管理
    linux 命令学习2
    linux 命令学习1——tr命令
    基于netty的一个简单的时间服务器的实现(netty学习)
    JavaNIO
    JavaNIO中的内存映射io
    打造高效的工作环境 – SHELL 篇
    linux下怎么清理缓存
    清理系统缓存
  • 原文地址:https://www.cnblogs.com/alan-W/p/5949607.html
Copyright © 2011-2022 走看看