POJ 1740 A New Stone Game(博弈)题解

题意:有n个石子堆,每一个都可以轮流做如下操作:选一个石堆,移除至少1个石子,然后可以把这堆石子随便拿几次,随便放到任意的其他石子数不为0的石子堆,也可以不拿。不能操作败。

思路:我们先来证明,如果某个石子数有偶数堆,则先手必败,因为无论先手怎么做,后手都能模仿先手,最后把石子取光。显然全是偶数堆是必败态。如果有奇数堆怎么办?我们就把最大的奇数堆取光,然后把其他奇数堆变成偶数堆。但是一定能保证可以吗?答案是可以。假设奇数堆的石子数为 x1,x2,x3...xn,那么我们分别给每一堆加上x2-x1,x3-x2...xn-xn-1,我们把这些我们加上的石子数加起来,发现我们一共用了xn-x1个石子,显然小于等于(xn) -1个石子。

参考:POJ 1740 A New Stone Game 题解《挑战程序设计竞赛》

代码:

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
typedef long long ll;
const int maxn = 100 + 10;
const int seed = 131;
const ll MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
using namespace std;
bool vis[maxn];
int main(){
    int n;
    while(~scanf("%d", &n) && n){
        memset(vis, false, sizeof(vis));
        for(int i = 0; i < n; i++){
            int u;
            scanf("%d", &u);
            vis[u] = !vis[u];
        }
        int flag = 0;
        for(int i = 1; i <= 100; i++)
            if(vis[i]) flag = 1;
        if(flag) printf("1\n");
        else printf("0\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/KirinSB/p/9683918.html

时间: 2024-10-12 07:32:12

POJ 1740 A New Stone Game(博弈)题解的相关文章

poj 1740 A New Stone Game nim变形

题意: 给n堆石子,两人交替,选择一堆石头后先拿去任意颗,再把剩下的放到其他任意堆,最先拿完所有石子赢,问先手必胜还是必败. 分析: 解决此类问题的一种的思路是先构造策略,然后判断此策略能否满足1.必胜态可到必败态.2.必败态无法到必败态. 代码: //poj 1740 //sep9 #include <iostream> #include <algorithm> using namespace std; const int maxN=128; int a[maxN]; int m

POJ 1740 A New Stone Game(博弈)

A New Stone Game Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6586 Accepted: 3611 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob mov

POJ 1740 A New Stone Game(多堆博弈找规律)

传送门 //有n堆,AB轮流从n堆的一堆中移任意个,可以扔掉,也可以移给其他堆中的一堆 //最先移完的胜 //如果n堆中两两堆数目相等,那肯定是B胜 //但只要有非两两相同的,如xyz,A先, //A可以从最多的那堆(z)移y-x个到x堆,yyp,最终移走p的一定是A #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; i

POJ 1740 A New Stone Game 又是博弈论配对找规律orz 博弈论 规律

http://poj.org/problem?id=1740 这个博弈一眼看上去很厉害很高大上让人情不自禁觉得自己不会写,结果又是找规律-- 博弈一般后手胜都比较麻烦,但是主要就是找和先手的对应关系,依然看了题解-- 如果所有石头堆两两配对的话后手对先手的每一步都可以对应走一步,那么此时后手必胜. 如果不是两两配对,先手可以通过一次操作使石头堆两两配对,此时的两两配对局面面对的是后手,所以先手必胜. 不是两两配对时的操作:首先将所有非配对推按大小排序(只有一堆直接取没就可以了): 然后显然不配对

博弈论(男人八题):POJ 1740 A New Stone Game

A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5694   Accepted: 3119 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob

POJ 1740 A New Stone Game

A New Stone Game Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 5453   Accepted: 2989 Description Alice and Bob decide to play a new stone game.At the beginning of the game they pick n(1<=n<=10) piles of stones in a line. Alice and Bob

[原博客] POJ 1740 A New Stone Game

题目链接题意:有n堆石子,两人轮流操作,每次每个人可以从一堆中拿走若干个扔掉(必须),并且可以从中拿走一些分到别的有石子的堆里(可选),当一个人不能拿时这个人输.给定状态,问是否先手必胜. 我们参考普通取石子游戏可知,如果只有一堆,先手必胜.如果有两堆一样,先手必败,对称博弈,第一个人怎么取,第二个人也可以怎么取,直到第一个人无法取为止.如果有四堆两两一样,还是先手必败,第一个人无论如何取,第二个人可以再次取成两两一样.如果有2*k堆两两一样,还是先手必败.注意:除了上述情况,都是先手必胜.因为

POJ 2348 Euclid&#39;s Game(博弈)题解

题意:有a,b两个数字,两人轮流操作,每次可以选择两个之中较小的数字,然后另一个数字减去选择数字的任意倍数(不能减到负数),直到其中一个为0,不能操作为败 思路:这题用博弈NP思想,必败点和必胜点之间的转化. 我们假设当前状态为(x,y)其中x>=y,那么必有以下任一状态: 1. x < 2 * y:那么这是只能执行一个操作x - y,如果这个操作之后变成必败态,那么当前为必胜态:反之亦然. 2. x >= 2 * y:显然此时有多种选择,假设x = k * y,如果x - (k - 1

POJ 1740

这题,通过多次试验,可以发现,当只存在两堆(以下称对)相等的石子时,先手必输.更进一步,当N对这样的石子存在时,先手必输. 于是,若1要赢,一种方法是,把石子都变成相等的对. 考虑石子中无对的情况,若存在对,我们把那些对忽略,因为先手对于这些对是必输的. 当N为奇数时,随机考虑这样的情况(有序)a<b<c<d<e.可知,先手必定能把这些石子变成对.因为e>=(b-a)+(d-c),只需从e中取走若干后把剩余的分配即可. 当N为偶数时,考虑a<b<c<d<