Cogs 56. 质数取石子(博弈)
来源:互联网 发布:Linux kill掉某个进程 编辑:程序博客网 时间:2024/05/23 13:47
- 质数取石子
★★ 输入文件:stonegame.in 输出文件:stonegame.out 简单对比
时间限制:1 s 内存限制:128 MB
问题描述
DD 和 MM 正在玩取石子游戏。他们的游戏规则是这样的:桌上有若干石子,DD 先取,轮流取,每次必须取质数个。如果某一时刻某一方无法从桌上的石子中取质数个,比如说剩下 0 个或 1 个石子,那么他/她就输了。
DD 和 MM 都很聪明,不管哪方存在一个可以必胜的最优策略,他/她都会按照最优策略保证胜利。于是,DD 想知道,对于给定的桌面上的石子数,他究竟能不能取得胜利呢?
当 DD 确定会取得胜利时,他会说:“不管 MM 选择怎样的取石子策略,我都能保证至多 X 步以后就能取得胜利。”那么,最小的满足要求的 X 是多少呢?注意,不管是 DD 取一次石子还是 MM 取一次石子都应该被计算为“一步”。
输入格式
第一行有一个整数 N,表示这个输入文件中包含 N 个测试数据。
第二行开始,每行有一个测试数据,其中仅包含一个整数,表示桌面上的石子数。
输出格式
你需要对于每个输入文件中的 N 个测试数据输出相应的 N 行。
如果对于该种情形是 DD 一定取得胜利,那么输出最小的 X。否则该行输出 -1。
样例输入
3
8
9
16
样例输出
1
-1
3
样例说明
当桌上有 8 个石子时,先取的 DD 只需要取走 7 个石子剩下 1 个就可以在一步之后保证胜利,输出 1。
当桌上有 9 个石子时。若 DD 取走 2 个,MM 会取走 7 个,剩下 0 个,DD 输。若 DD 取走 3 个,MM 会取走 5 个,剩下 1 个,DD 输。DD 取走 5 个或者 7 个的情况同理可知。所以当桌上有 9 个石子时,不管 DD 怎么取,MM 都可以让 DD 输,输出 -1。
当桌上有 16 个石子时,DD 可以保证在 3 步以内取得胜利。可以证明,为了在 3 步内取得胜利,DD 第一步必须取 7 个石子。剩下 9 个石子之后,不管第二步 MM 怎么取,DD 取了第三步以后可以保证胜利,所以输出 3。
数据范围
输入文件中的数据数 N<=10。
每次桌上初始的石子数都不超过 20000。
/*比较简单.但是没有1A QWQ. 一开始把A的决策搞成max了.求个sg函数,判一判必胜必败态就好.*/#include<iostream>#include<cstdio>#define MAXN 20001using namespace std;int n,sg[MAXN],pri[MAXN],tot;bool b[MAXN],f[MAXN];void pre(){ for(int i=2;i<=MAXN-1;i++) { if(!b[i]) pri[++tot]=i,f[i]=1,sg[i]=1; for(int j=i+i;j<=MAXN-1;j+=i) b[j]=true; } int x=1; for(int i=2;i<=MAXN-1;i++) { if(pri[x]==i) { f[i+1]=1; sg[i+1]=1; x++; } if(x==tot+1) break; }}void check(int x){ int max1=0; bool flag=false; for(int i=1;i<=tot;i++) { if(pri[i]>x) break ; if(!f[x-pri[i]]) flag=true; } if(!flag) { for(int i=1;i<=tot;i++) { if(pri[i]>x) break ; if(f[x-pri[i]]) max1=max(max1,sg[x-pri[i]]); } } else { max1=1e9; for(int i=1;i<=tot;i++) { if(pri[i]>x) break ; if(!f[x-pri[i]]) max1=min(max1,sg[x-pri[i]]); } } f[x]=flag; sg[x]=max1+1;}void slove(){ sg[0]=0,f[0]=f[1]=false; for(int i=1;i<=MAXN-1;i++) if(b[i]) check(i);}int main(){ freopen("stonegame.in","r",stdin); freopen("stonegame.out","w",stdout); int x; pre();slove(); scanf("%d",&n); while(n--) { scanf("%d",&x); if(!f[x]) printf("-1\n"); else printf("%d\n",sg[x]); } return 0;}
0 0
- Cogs 56. 质数取石子(博弈)
- YCJSOI1472 质数取石子(博弈dp)
- Rqnoj116 质数取石子
- 威佐夫博弈-取石子
- 博弈---取石子游戏
- 取石子游戏+博弈
- 博弈-取石子
- 取石子 博弈
- 【博弈】下棋、取石子、。。
- 取石子游戏-博弈
- 博弈-取石子游戏
- 【博弈】取石子游戏
- rqnoj-116-质数取石子
- Cogs 2546. 取石块儿(博弈)
- [BZOJ 3895]取石子---博弈+石子合并
- NYOJ博弈系列-取石子
- HDU2516-取石子游戏-博弈
- 博弈(取石子)专题
- 浅谈数据结构——如何解决hash冲突
- Java多线程——线程
- windows下基于python中的rename进行批量重命名
- win8.1开启快速启动后无法正常关机,睡眠休眠无法使用
- 记好成长路的点点滴滴
- Cogs 56. 质数取石子(博弈)
- [数据结构]二叉树
- C语言基础 for语句判断奇数
- 基本排序算法
- html文件改jsp文件技巧
- HDU 5303 Delicious Apples
- 关于初学python的一点问题总结(二)
- 详解应对平台高并发的分布式调度框架TBSchedule
- Java 8 中的 Streams API 详解