POJ 2315:Football Game(博弈论)
2017-03-27 23:16
232 查看
【题目链接】 http://poj.org/problem?id=2315
【题目大意】
两名球员轮流从N个球中挑出不多于M个射门,每个球半径都是R,离球门S。
每次只能踢出L以内的距离。进最后一个球者胜,求谁有必胜策略?
【题解】
我们发现对数据进行处理之后,题目等价于给出n堆石子,
每堆石子中每次最多取k个石子,每次最多选取m个石子堆做操作的博弈问题
首先我们将每堆石子堆对k+1取模简化运算,
对于只能取一堆石子上的石子的做法我们是对所有的石子堆的sg值进行xor运算得到sg值
xor又称为半加运算,只进行加法而不进位,
对于选取m堆石子的博弈我们的xor则是对于m+1进制下的半加运算,
所以我们按位计算这个sg值,模拟m+1进制下的半加运算即可得到答案。
【代码】
【题目大意】
两名球员轮流从N个球中挑出不多于M个射门,每个球半径都是R,离球门S。
每次只能踢出L以内的距离。进最后一个球者胜,求谁有必胜策略?
【题解】
我们发现对数据进行处理之后,题目等价于给出n堆石子,
每堆石子中每次最多取k个石子,每次最多选取m个石子堆做操作的博弈问题
首先我们将每堆石子堆对k+1取模简化运算,
对于只能取一堆石子上的石子的做法我们是对所有的石子堆的sg值进行xor运算得到sg值
xor又称为半加运算,只进行加法而不进位,
对于选取m堆石子的博弈我们的xor则是对于m+1进制下的半加运算,
所以我们按位计算这个sg值,模拟m+1进制下的半加运算即可得到答案。
【代码】
#include <cstdio> #include <cstring> #include <cmath> using namespace std; const int N=30; const double PI=acos(-1.0); int n,m,l,r,a ,sg ; int dis(int s){return (int)(s/(2*PI*r))+1;} bool solve(){ memset(sg,0,sizeof(sg)); int k=dis(l); for(int i=0;i<n;i++)for(int j=0,g=dis(a[i])%k;sg[j]+=g&1,g;j++,g>>=1); for(int i=0;i<30;i++)if(sg[i]%(m+1))return 1; return 0; } int main(){ while(~scanf("%d%d%d%d",&n,&m,&l,&r)){ for(int i=0;i<n;i++)scanf("%d",&a[i]); puts(solve()?"Alice":"Bob"); }return 0; }
相关文章推荐
- poj 2315 Football Game (博弈 nim k game)
- POJ 2315 Football Game 已翻译
- POJ 2960 S-Nim 博弈论,SG函数
- poj 2234 博弈论Nim取子游戏
- poj1082——Calendar Game(博弈论,奇偶判定)
- poj1704 Georgia and Bob博弈论
- POJ 2505 && HDU 1517 A multiplication game(博弈论)
- poj 2599 A funny game 博弈论
- POJ-2425(A Chess Game)——博弈论 SG函数
- poj1740 A New Stone Game(博弈论)
- POJ【数论/组合/博弈论】题目列表
- ACM中的博弈论入门(六)POJ 3537 SG函数
- poj 1067||hdu 1527 取石子游戏(博弈论,Wythoff Game)
- poj 3537 Crosses and Crosses 博弈论
- POJ-2960(S-Nim)——博弈论,SG函数
- POJ【数论/组合/博弈论】题目列表
- POJ 2348-Euclid's Game(博弈论)
- 【博弈论】POJ[2348]Euclid's Game
- poj-1740 A New Stone Game 博弈论
- POJ【数论/组合/博弈论】