zoukankan      html  css  js  c++  java
  • poj 1704 Georgia and Bob (nim)

    题意:

    N个棋子,位置分别是p[1]...p[N]。

    Georgia和Bob轮流,每人每次可选择其中一个棋子向左移动若干个位置(不能超过前一个棋子,不能超出最左边【位置1】且不能不移)

    Georgia先手,问谁赢。

    思路:

    将棋子按位置从右到左两个两个作为一对。若棋子总个数是奇数,将第一个棋子和【位置0】作为一对。(可想象位置0放了一个棋子)。

    情况一:先手若移动某对棋子中的第一个棋子K位,则后手可将该对棋子中的第二个棋子也移动K位。即这种情况不对结果产生影响。

    情况二:先手若移动某对棋子中的第二个棋子。可将每对棋子两个棋子之间的距离看成一堆石头的个数。则此题和取石子一模一样!

    OK,直接看代码..

    代码:

    int T,n;
    int p[1005], a[1005];
    
    int main(){
        cin>>T;
        while(T--){
            scanf("%d",&n);
            rep(i,1,n) scanf("%d",&p[i]);
    
            sort(p+1,p+1+n);
            p[0]=0;
            int num=0;
            for(int i=n;i>0;i-=2){
                a[++num]=p[i]-p[i-1]-1;
            }
    
            int ans=a[1];
            rep(i,2,num){
                ans=ans^a[i];
            }
    
            if(ans)
                puts("Georgia will win");
            else
                puts("Bob will win");
        }
    }
  • 相关阅读:
    根据JumpServer官方文档搭建服务流程
    Dockerfile常用指令总结(转载)
    高可用集群-lvs
    k8s 基于Kubeadm部署高可用集群
    Docker部署GitLab
    文本处理三剑客-grep
    文件权限
    Docker监控平台
    Redis占用大量内存问题分析
    Annotation
  • 原文地址:https://www.cnblogs.com/fish7/p/4004378.html
Copyright © 2011-2022 走看看