zoukankan      html  css  js  c++  java
  • POJ1704_棋盘上的博弈

    /*
    *State: 1704    Accepted    200K    16MS    C++    594B
    *题目大意:
    *        一个1*M的棋盘上有N个棋子,初始位置一定,两人轮流操作,
    *        每次移动一枚棋子,要求只能向左移且至少移动一格,而且不
    *        能到达或经过以前有棋子的格子,谁无法移动棋子就算输。
    *解题思路:
    *        先考虑两个棋子靠在一起的时候,这两对棋子就构成了一个
    *        奇异局势(P点)。所以可以把题目中的棋子分解为两对两对,
    *        两对两对之间是不需要考虑什么的。在同一对棋子中,如果对
    *        手移动前一个,你总能对后一个移动相同的步数,所以一对
    *        棋子的前一个和前一对棋子的后一个之间有多少个空位置对
    *        最终的结果是没有影响的。每两对构成一组,而这两对之间就
    *        是一堆石子。然后就可以Nim博弈了。注意如果是奇数个棋子,
    *        首个棋子要跟棋盘首构成一对。
    */
    View Code
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    
    using namespace std;
    
    const int MAX = 10005;
    
    int main(void)
    {
        int cas;
        scanf("%d", &cas);
        while(cas--)
        {
            int ini[MAX];
            int n;
            scanf("%d", &n);
            for(int i = 0; i < n; i++)
                scanf("%d", &ini[i]);
            sort(ini, ini + n);
            
            int sum = 0;
            for(int i = n - 1; i >= 0; i -= 2)
            {
                int tmp;
                if(i == 0)
                    tmp = ini[i] - 1;
                else
                    tmp = ini[i] - ini[i - 1] - 1;
                sum ^= tmp;
            }
    
            if(!sum)
                printf("Bob will win\n");
            else
                printf("Georgia will win\n");
        }
        return 0;
    }
  • 相关阅读:
    Java
    一个web项目web.xml的配置中<context-param>配置作用
    JVM之几种垃圾收集器简单介绍
    JVM日志和参数的理解
    Java GC日志查看
    Java-性能调优-理解GC日志
    理解Java的GC日志
    tomcat打印GC日志
    快速解读GC日志
    Java 堆内存
  • 原文地址:https://www.cnblogs.com/cchun/p/2610154.html
Copyright © 2011-2022 走看看