POJ 2315:Football Game(博弈论)
2024-09-07 18:51:08
【题目链接】 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进制下的半加运算即可得到答案。
【代码】
#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[N],sg[N];
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;
}
最新文章
- SDL简介(网络汇总)
- Java线程中带有返回值的线程Callable
- Maplace.js – 小巧实用的 jQuery 谷歌地图插件
- 复利计算软件v3
- 持续集成 .Net手册--提升开发效率和质量
- app设计需注意的
- Linux下设置网卡随系统启动
- iOS开发--数组
- thinkphp3.2.3 版本使用redis缓存的时候无法使用认证
- TweenLite JS版
- C++雾中风景4:多态引出的困惑,对象的拷贝?
- centos7环境下mysql5.7的安装与配置
- ACM hdu 3336 Count the string
- mac charles手机抓包详细教程
- 2017-12-19python全栈9期第四天第二节之列表的增删改查之切片
- Sping AOP Capabilities and Goals
- 2018上C语言程序设计(高级)作业- 第3次作业成绩
- python-算法基础
- 使用uiautomator2进行webview页面的测试
- R实战 第十篇:列联表和频数表