【COGS 56】质数取石子
【问题描述】
当 DD 确定会取得胜利时,他会说:“不管 MM 选择怎样的取石子策略,我都能保证至多 X 步以后就能取得胜利。”那么,最小的满足要求的 X 是多少呢?注意,不管是 DD 取一次石子还是 MM 取一次石子都应该被计算为“一步”。
【输入格式】
【输出格式】
【样例输入】
- 3
- 8
- 9
- 16
【样例输出】
- 1
- -1
- 3
【样例说明】
当桌上有 16 个石子时,DD 可以保证在 3 步以内取得胜利。可以证明,为了在 3 步内取得胜利,DD 第一步必须取 7 个石子。剩下 9 个石子之后,不管第二步 MM 怎么取,DD 取了第三步以后可以保证胜利,所以输出 3。
【数据范围】
【分析】
动态规划。
首先打出素数表,用v[i]来保存DD有i颗石子的时候是否可以胜利,1代表可以,0代表不可以。
v[i]通过前面的状态可以计算出来,如果v[i-p](p为素数)为false,显然v[i]就应该为1,因为多取了一次。
然后对于不同的v[i]状态分情况讨论,
f[i]=min{f[i-prime[j]]}(v[i]=1)计算可能获胜时最少的步数
f[i]=max{f[i-prime[j]]}(v[i]=0)计算不可能获胜时最多的步数
- #include <cstdlib>
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <queue>
- #define LOCAL
- const int maxn=+;
- using namespace std;
- int prime[maxn];
- int flag[maxn],f[maxn];
- int v[maxn];
- void prepare();
- int main(){
- int T,n;
- #ifdef LOCAL
- freopen("data.txt","r",stdin);
- freopen("out.txt","w",stdout);
- #endif
- prepare();//打表
- scanf("%d",&T);
- while (T--){
- scanf("%d",&n);
- if (v[n]) printf("%d\n",f[n]);
- else printf("-1\n");
- }
- return ;
- }
- void prepare(){
- prime[]=;
- for (int i=;i<=;i++){
- int g=;
- for (int j=;j<=prime[];j++){
- if (i%prime[j]==){
- g=;
- break;
- }
- }
- //增加新的质数
- if (g) prime[++prime[]]=i;
- flag[i]=prime[];
- }
- memset(v,,sizeof(v));
- memset(f,,sizeof(f));
- for (int i=;i<=;i++){
- for (int j=flag[i];j>=;j--)
- if (!v[i-prime[j]]){
- v[i]=;
- break;
- }
- //printf("%d\n",v[i]);
- }
- int tmp=;
- for (int i=;i<=;i++){
- if (v[i]){
- tmp=;
- for (int j=flag[i];j>=;j--)
- if (!v[i-prime[j]]) tmp=min(tmp,f[i-prime[j]]);
- }
- else {
- tmp=-;
- for (int j=flag[i];j>=;j--)
- tmp=max(tmp,f[i-prime[j]]);
- }
- f[i]=tmp+;
- }
- return;
- }
【COGS 56】质数取石子的更多相关文章
- Cogs 56. 质数取石子(博弈)
质数取石子 ★★ 输入文件:stonegame.in 输出文件:stonegame.out 简单对比 时间限制:1 s 内存限制:128 MB 问题描述 DD 和 MM 正在玩取石子游戏.他们的游戏规 ...
- P1857 质数取石子 (DP,递推)
题目描述 桌上有若干个石子,每次可以取质数个.谁先取不了,谁就输.问最少几步能赢?(一个人取一次算一步) 输入输出格式 输入格式: 第一行N,表示有N组数据 接下来N行为石子数 输出格式: 每组数据一 ...
- 洛谷 P4018 Roy&October之取石子
洛谷 P4018 Roy&October之取石子 题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质 ...
- 洛谷 P4706 取石子 解题报告
P4706 取石子 题目描述 现在 Yopilla 和 yww 要开始玩游戏! 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一些 ...
- 洛谷 Roy&October之取石子
题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取pk 个(p为质数,k为自然数,且pk小于等于当前剩余石子数),谁取走最后一个石子 ...
- 洛谷——P4018 Roy&October之取石子
P4018 Roy&October之取石子 题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取p^kpk个(p为质数,k为自 ...
- P4018 Roy&October之取石子
题目背景 Roy和October两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有n个石子,两人每次都只能取 p^kpk 个(p为质数,k为自然数,且 p^kpk 小于等于当前剩余石子数), ...
- 洛谷P4018 Roy&October之取石子
题目背景 \(Roy\)和\(October\)两人在玩一个取石子的游戏. 题目描述 游戏规则是这样的:共有\(n\)个石子,两人每次都只能取\(p^k\)个(\(p\)为质数,\(k\)为自然数,且 ...
- {HDU}{2516}{取石子游戏}{斐波那契博弈}
题意:给定一堆石子,每个人最多取前一个人取石子数的2被,最少取一个,最后取石子的为赢家,求赢家. 思路:斐波那契博弈,这个题的证明过程太精彩了! 一个重要的定理:任何正整数都可以表示为若干个不连续的斐 ...
随机推荐
- Android 金融项目整理
本来是安安心心周末休假的时间,却被强征来加班.魔都今天雾霾严重,窗外都看不到360无死角都能看到的东方明珠.吃完午饭后睡一觉起来,觉得该给自己做点事情了.那就把项目里面的一些可圈可点的技术都罗列出来, ...
- 动态规划(模型转换):uvaoj 1625 Color Length
[PDF Link]题目点这里 这道题一眼就是动态规划,然而貌似并不好做. 如果不转换模型,状态是难以处理的. 巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中. #include <i ...
- 【链表】【模拟】Codeforces 706E Working routine
题目链接: http://codeforces.com/problemset/problem/706/E 题目大意: 给一个N*M的矩阵,Q个操作,每次把两个同样大小的子矩阵交换,子矩阵左上角坐标分别 ...
- delphi record 内存怎么释放
delphi record 内存怎么释放 是不需要释放的,除非你使用指针方式生成的.
- 动态规划——K背包问题
Problem DescriptionNow you are asked to measure a dose of medicine with a balance and a number of we ...
- 暴力求解——素环数 Prime Ring Problem ,UVa 524
Description A ring is composed of n (even number) circles as shown in diagram. Put natural numbers i ...
- AOJ 0525 穷举
题意:有一个烤饼器可以烤r行c列的煎饼,煎饼可以正面朝上(用1表示)也可以背面朝上(用0表示).一次可将同一行或同一列的煎饼全部翻转.现在需要把尽可能多的煎饼翻成正面朝上,问最多能使多少煎饼正面朝上? ...
- poj 1556 The door
题目链接:http://poj.org/problem?id=1556 #include<cstdio> #include<cstring> #include<cmath ...
- 分布式锁 基于Redis
分布式锁的实现(基于Redis) 参考:http://www.jb51.net/article/75439.htm http://www.linuxidc.com/Linux/2015-01/1118 ...
- python list排序的两种方法及实例讲解
对List进行排序,Python提供了两个方法方法1 用List的内建函数list sort进行排序list sort(func=None, key=None, reverse=False)Pytho ...