POJ 1740 A New Stone Game 博弈,规律

来源:互联网 发布:卡巴斯基软件和nod软件 编辑:程序博客网 时间:2024/04/30 00:59

题目链接:这里
题意:对于n堆石子,每堆若干个,两人轮流操作,每次操作分两步,第一步从某堆中去掉至少一个,第二步(可省略)把该堆剩余石子的一部分分给其它的某些堆。最后谁无子可取即输。
解法:算规律题吧。。来自网上大神的一段分析。

首先看两堆:1 1 的状态肯定是先手输~~但是俩数不一样的话就是先手赢了。。再看三堆:1 1 1的状态肯定是先手赢,1 2 1也是先手赢。。。1 2 2也是先手赢。。总之都是先手赢。。再看四堆:1 1 2 2 这样的肯定是先手输。。1 1 2 3 这样的就是先手赢了。。。1 2 3 4是先手赢。。再看五堆:1 1 1 1 1 是先手赢。。1 1 1 1 2 先手赢。。。。…………都是先手赢。。1 2 3 4 1  也是先手赢。。。。各种先手赢。。由上我们可以得出结论。。。堆的个数为奇数的情况下。。各种先手赢。总是先手赢。。。堆的数目为偶数的情况下。。如果当前各个堆的石头数目能够对称。。也就是说。。把石头数目排序之后。。第1、2堆数量相等。。3、4堆数量相等,5、6堆数量相等………………这样的情况下。。先手必输。。其他情况都是先手赢。。。
//POJ 1740#include <stdio.h>#include <string.h>#include <algorithm>int a[11], num[110];int main(){    int n;    while(scanf("%d", &n) != EOF && n)    {        memset(num, 0, sizeof(num));        for(int i = 1; i <= n; i++){            scanf("%d", &a[i]);            num[a[i]]++;        }        int cnt = 0;        for(int i = 1; i <= 100; i++) if(num[i]%2==1) cnt++;        puts(cnt?"1":"0");    }    return 0;}
0 0
原创粉丝点击