uvaoj 10404 Bachet's Game 减法博弈

来源:互联网 发布:免费发广告软件 编辑:程序博客网 时间:2024/05/21 18:43
uvaoj 10404 Bachet's Game 减法博弈
就是一个巴什博弈的变形,叫做减法博弈。轮流取石子,只能取给定的集合中的石子个数,取到最后一个石子的人获胜。
使用dp[i]表示有i颗石子时的胜负状态,则i-a[j]是之前能达到的状态,如果他们中至少有一个是必胜态,那么i是必败态,否则i时必胜态。
代码如下:
/*************************************************************************> File Name: 10404.cpp> Author: gwq> Mail: gwq5210@qq.com > Created Time: 2014年12月19日 星期五 21时29分25秒 ************************************************************************/#include <cmath>#include <ctime>#include <cctype>#include <climits>#include <cstdio>#include <cstdlib>#include <cstring>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <vector>#include <sstream>#include <iostream>#include <algorithm>#define INF (INT_MAX / 10)#define clr(arr, val) memset(arr, val, sizeof(arr))#define pb push_back#define sz(a) ((int)(a).size())using namespace std;typedef set<int> si;typedef vector<int> vi;typedef map<int, int> mii;typedef long long ll;const double esp = 1e-5;#define N 20int a[N];int dp[1000010];int main(int argc, char *argv[]){int n, m;while (scanf("%d%d", &n, &m) != EOF) {for (int i = 0; i < m; ++i) {scanf("%d", &a[i]);}sort(a, a + m);clr(dp, 0);dp[0] = 0;for (int i = 1; i <= n; ++i) {for (int j = 0; j < m; ++j) {if (i >= a[j] && dp[i - a[j]] == 0) {dp[i] = 1;break;}}//printf("%d ", dp[i]);}printf("%s\n", (dp[n] == 1) ? "Stan wins" : "Ollie wins");}return 0;}


0 0