【题目链接】 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;
}

最新文章

  1. SDL简介(网络汇总)
  2. Java线程中带有返回值的线程Callable
  3. Maplace.js – 小巧实用的 jQuery 谷歌地图插件
  4. 复利计算软件v3
  5. 持续集成 .Net手册--提升开发效率和质量
  6. app设计需注意的
  7. Linux下设置网卡随系统启动
  8. iOS开发--数组
  9. thinkphp3.2.3 版本使用redis缓存的时候无法使用认证
  10. TweenLite JS版
  11. C++雾中风景4:多态引出的困惑,对象的拷贝?
  12. centos7环境下mysql5.7的安装与配置
  13. ACM hdu 3336 Count the string
  14. mac charles手机抓包详细教程
  15. 2017-12-19python全栈9期第四天第二节之列表的增删改查之切片
  16. Sping AOP Capabilities and Goals
  17. 2018上C语言程序设计(高级)作业- 第3次作业成绩
  18. python-算法基础
  19. 使用uiautomator2进行webview页面的测试
  20. R实战 第十篇:列联表和频数表

热门文章

  1. Codeforces 937.C Save Energy!
  2. Linux重定向: &gt; 和 &amp;&gt; 区别
  3. Spring--环境配置
  4. jsp中路径的问题。。。
  5. tr/td
  6. 使用FindBugs-IDEA插件找到代码中潜在的问题
  7. bzoj1251: 序列终结者 fhqtreap写法
  8. 【洛谷 P1631】 序列合并 (堆)
  9. django执行sql
  10. python基础之函数(自定义函数)