zoukankan      html  css  js  c++  java
  • POJ1740_A New Stone Game_推规律的博弈

    /*
    *State: 164K  0MS    C++    1254B
    *题目大意:
    *        对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,
    *        第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余
    *        石子的一部分分给其它的某些堆。最后谁无子可取即输。
    *解题思路:
    *        1、先考虑1堆的时候,1堆当然是N点(必胜点),
    *        2、然后考虑2堆,细想一下可以发现,当2堆一样时,这个时候
    *           的目的就是要把对方给逼到只有2堆都是1的时候,就能必胜了。
    *           但是想一下,后手只要模范先手所做的动作,那么最后就会形成
    *           两堆都是1的局势,所以当2堆相同时,是一个P点(必败点)。
    *           注意当2堆不一样的时候,先手可以把它变成一样,此时变为N点。
    *        3、考虑3堆,这个时候,先手必定是可以把局势变成2堆相同的堆的,
    *           那么先手肯定胜利,为N点。
    *
    *          (发现,当堆为偶数堆两两同高的时候,此时是P点)
    *
    *        偶数:
    *        4、当n >= 4堆的时候可以发现,可以把堆的高度按从小到大排列。
    *           当n为偶数的时候,可以把最高的那一堆跟最小的那一堆变成一样,
    *           然后把高度差用来平衡剩余的那些堆,注意一定是可以平衡的,
    *           因为把剩余的堆相邻两两的差值投射到y轴上发现这些离散的线段和
    *           小于最高堆于最小堆的差值。
    *        奇数:
    *        5、当n >= 4堆的时候可以发现,可以把堆的高度按从小到大排列。
    *           当n为奇数的时候,可以把最高堆给去掉,然后分配给其它堆,
    *           注意前面的相邻堆两两的差值投射到y轴,最后的总和还是小于
    *           最高堆的。
    */
    View Code
     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <algorithm>
     4 using namespace std;
     5 
     6 int main(void)
     7 {
     8     int n;
     9     while(scanf("%d", &n), n)
    10     {
    11         int tmp, flag = 0, pile[15];
    12         int f[1024] = {0}, ans = 0;
    13         for(int i = 0; i < n; i++)
    14         {
    15             scanf("%d", &tmp);
    16             if(!f[tmp])
    17                 ans++;
    18             else
    19                 ans--;
    20             f[tmp] = !f[tmp];
    21             //pile[i] = tmp;
    22         }
    23 
    24         //sort(pile, pile + n);
    25 
    26         /*for(int i = 1; i < n; i += 2)
    27         {
    28             if(pile[i] != pile[i - 1])
    29                 flag = 1;
    30         }*/
    31         
    32         if(n & 1)
    33         {
    34             printf("1\n");
    35         }
    36         else
    37         {
    38             if(!ans)
    39                 printf("0\n");
    40             else
    41                 printf("1\n");
    42         }
    43 
    44     }
    45     return 0;
    46 }
  • 相关阅读:
    [DB] 数据库的连接
    JS leetcode 翻转字符串里的单词 题解分析
    JS leetcode 拥有最多糖果的孩子 题解分析,六一快乐。
    JS leetcode 搜索插入位置 题解分析
    JS leetcode 杨辉三角Ⅱ 题解分析
    JS leetcode 寻找数组的中心索引 题解分析
    JS leetcode 移除元素 题解分析
    JS leetcode 最大连续1的个数 题解分析
    JS leetcode 两数之和 II
    JS leetcode 反转字符串 题解分析
  • 原文地址:https://www.cnblogs.com/cchun/p/2609272.html
Copyright © 2011-2022 走看看