硬币游戏1
2017-08-09 17:38
274 查看
Alice和Bob在玩这样一个游戏。给定k个数字a[1],a[2],…,a[k]。一开始,有x枚硬币,Alice和Bob轮流取硬币。每次所取硬币的枚数一定要在a[1],a[2],…,a[k]当中。Alice先取,取走最后一枚硬币的一方获胜。当双方都采取最优策略时,谁会获胜?题目假定a[1],a[2],…,a[k]中一定有1。
从后往前递推状态,从小到大确定剩余石子的数量为i的时候的状态,他的前一个状态只要能出现必败态当前就一定是必胜的状态。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int x , k;
int a[1000];
bool win[1000];
void solve()
{
for(int i = 0 ; i <= x ;i++)
{
win[i] = false;
for(int j = 0 ; j < k ; j++)
{
win[i] |= (!win[i-a[j]] && a[j]<=i);
}
}
}
int main()
{
cin >> x >> k;
for(int i = 0 ; i < k ; i++)
{
cin >> a[i];
}
solve();
if(win[x]) cout << "Alice" << endl;
else cout << "Bob" << endl;
return 0;
}
从后往前递推状态,从小到大确定剩余石子的数量为i的时候的状态,他的前一个状态只要能出现必败态当前就一定是必胜的状态。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
int x , k;
int a[1000];
bool win[1000];
void solve()
{
for(int i = 0 ; i <= x ;i++)
{
win[i] = false;
for(int j = 0 ; j < k ; j++)
{
win[i] |= (!win[i-a[j]] && a[j]<=i);
}
}
}
int main()
{
cin >> x >> k;
for(int i = 0 ; i < k ; i++)
{
cin >> a[i];
}
solve();
if(win[x]) cout << "Alice" << endl;
else cout << "Bob" << endl;
return 0;
}
相关文章推荐
- BZOJ 4820 [Sdoi2017]硬币游戏 ——期望DP 高斯消元
- hdu 4642 Fliping game 翻硬币游戏 抓住特征变量
- g 分硬币游戏 两堆硬币a,b个,AekdyCoin先拿硬币,abcdxyzk后拿,接着轮流拿。谁那最后一个谁赢。每次只拿任一堆中的任意个。
- [Sdoi2016]硬币游戏
- HDU 3537 Mock Turtles型翻硬币游戏
- 【BZOJ】2017: [Usaco2009 Nov]硬币游戏(dp+神题+博弈论)
- 51nod-1381 硬币游戏
- 拿硬币游戏
- hdu 4642 Fliping game 翻硬币游戏 抓住特征变量
- 51Nod 1381:硬币游戏
- 51nod 1381 硬币游戏
- 51nod 1381 硬币游戏
- 51Nod 1381 硬币游戏
- bzoj1411: [ZJOI2009]硬币游戏
- Introduction to Java Programming编程题7.11<硬币游戏:显示正反面>
- HDOJ 3537 Daizhenyang's Coin (翻硬币游戏)
- 敏捷游戏:从硬币游戏学习Scrum敏捷方法
- 51Nod-1381-硬币游戏
- hdoj 1847 (同硬币游戏1)
- 常胜游戏系列:填满硬币