<传送门>

B - Apple

Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
SubmitStatus

Problem Description

Alice and Bob are coming.
This time, they are playing with apples. Initially, there are N baskets and M apples. Both baskets and apples are distinguishable. Each turn, (s)he can choose adding a basket or an apple. Alice always plays first. When (s)he complete operation, if the number of ways to split apples into baskets is not less than A, (s)he lose.
Now Alice wonder whether she can win if both player use best strategy.

Input

There are multiple test cases.
Each test case contains three integers N, M and A.
1 <= N <= 10,000
1 <= M <= 30
2 <= A <= 1,000,000,000

Output

For each test case, if Alice can win, output "win" and if Bob can win, output "lose"; otherwise output "draw".

Sample Input

3 1 4
2 2 10

Sample Output

lose
win

【题目大意】

有N个篮子和M个苹果,篮子和苹果都是有区别的。
对于每一个回合,他或她可以选择增加一个篮子或者一个苹果。爱丽丝总是第一个动手。
当他们完成一次操作后,如果将苹果分配到篮子里的方法大于等于A,则输。

现在要你判断先手的胜负。

N----篮子数
M---苹果数
A---上限

【题目分析】

定位:常见的dp博弈 、记忆化搜索

像这种没有SG函数的博弈已经很少见了,SG函数的博弈才真叫人蛋疼。

这题的一个细节的地方就是当篮子数=1的时候判断有点麻烦,其他的也不是很难。

具体看代码(注释很详细):

//Memory   Time
// 1680K 0MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 1100
#define LL long long
using namespace std;
int dp[40][30];
int A;
bool check(int n,int m){ //组合数
long long way=1;
for(int i=1;i<=n;i++){
way*=m;
if(way>=A) //不满足条件
return false;
}
return true; //满足条件
} //2--- 平局
//1-----win
//0----lose int dfs(int n,int m){
if(m==1){ //这个是细节,开始一直没想到
if(n*n>=A){
return 2; //只有一个篮子,并且一开始就大于A,平局
}
else{
int tmp1=-1,tmp2=-1;
if(check(n+1,m)){
tmp1=dfs(n+1,m);
if(tmp1==0) return 1;
}
if(check(n,m+1)){
tmp2=dfs(n,m+1);
if(tmp2==0)return 1;
}
if(tmp1==2) return 2;
else return 0;
}
} //使用dp数组来记录每一次的搜索值(记忆化搜索) if(dp[n][m]!=-1)
return dp[n][m];
int tmp1=-1,tmp2=-1;
if(check(n+1,m)){
tmp1=dfs(n+1,m);
if(tmp1==0) return dp[n][m]=1;
}
if(check(n,m+1)){
tmp2=dfs(n,m+1);
if(tmp2==0) return dp[n][m]=1;
}
if(tmp1==2||tmp2==2) return dp[n][m]=2;
else return dp[n][m]=0;
} int main(){
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
int n,m;
while(scanf("%d %d %d",&m,&n,&A)!=EOF){
memset(dp,-1,sizeof(dp));
int k=dfs(n,m);
if(k==2)puts("draw");
else if(k==1)puts("win");
else puts("lose");
}
return 0;
}

  

dp --- acdream原创群赛(16) --- B - Apple的更多相关文章

  1. ACdream原创群赛__15

    这场感觉题目确实还算可以,不过,说好的每题10s效果上却不理想.这个时限还算比较紧.因为时间不是按绝对的多出几秒来计算,而是几倍来计算的. 比赛做的不好,后面又去做了一下. A:典型的数位DP,一直坑 ...

  2. ACdream原创群赛(13)のwuyiqi退役专场 C True love

    True love Time Limit: 4000/2000 MS (Java/Others)     Memory Limit:128000/64000 KB (Java/Others) Prob ...

  3. ACdream原创群赛(18)のAK's dream题解

    只做了4题水题ADGI A题需要注意的就是“[...]”的输出了,何时输出,何时不输出. #include <stdio.h> int main() { int n, cur, d; ; ...

  4. 群赛 ZOJ3741(dp) ZOJ3911(线段树)

    zoj3741 简单dp.wa了两个小时,中间改了好多细节.后来还是不对,参考了别人的代码,发现一个致命问题,初始化的时候,不是每种状态都能直接达到的.初始化成-1. (题目有个小坑,0<=L& ...

  5. ACdream群赛1112(Alice and Bob)

    题意:http://acdream.info/problem?pid=1112 Problem Description Here  is Alice and Bob again ! Alice and ...

  6. centos环境 使用kubeadm快速安装k8s集群v1.16.2

    全程使用root用户运行,宿主机需要连接外网 浏览一下官方kubeadm[有些镜像用不了] https://kubernetes.io/docs/setup/production-environmen ...

  7. [原创]obj-c编程16:键值编码(KVC)

    原文链接:obj-c编程16:键值编码(KVC) 我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...

  8. 二进制安装K8S集群V1.16.3

    centos linux7.5 cat > /etc/hosts << EOF 192.168.199.221 master 192.168.199.222 node1 192.16 ...

  9. kubeadm部署K8S集群v1.16.3

    本次先更新kubeadm快速安装K8S,二进制安装上次没写文档,后续更新,此次最新的版本是V1.16.3 1.关闭防火墙.关闭selinux.关闭swapoff -a systemctl stop f ...

随机推荐

  1. OpenCV 学习笔记(0)两幅图像标定配准

    参考教程 依赖opencv扩展库,使用sifi匹配 保存配准信息 "./config/calibratedPara.yaml" #include <iostream> ...

  2. 洛谷 P1993 小K的农场 题解

    每日一题 day55 打卡 Analysis 这是我们一次考试的T1,但我忘了差分约束系统怎么写了,所以就直接输出Yes混了60分 首先转化题目: 1:表示农场 a 比农场 b 至少多种植了 c 个单 ...

  3. Numpy | 05 创建数组

    ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建. 一.numpy.empty numpy.empty 方法用来创建一个指定形状(shape).数据类 ...

  4. Python 检查代码占用内存 工具和模块

    只介绍简单的使用, 更多使用方法请查看官方文档 tracemalloc 官方文档 tracemalloc文档地址 使用 import tracemalloc tracemalloc.start() # ...

  5. REdis一致性方案探讨

    REdis功能强大众所周知,能够大幅简化开发和提供大并发高性能,但截止到REdis-5.0.5仍然存在如下几大问题: 一致性问题 这是由于REdis的主从复制采用的是异步复制,异常时可能发生主节点的数 ...

  6. Django 基础篇(二)视图与模板

    视图 在django中,视图对WEB请求进行回应 视图接收reqeust对象作为第一个参数,包含了请求的信息 视图就是一个Python函数,被定义在views.py中 #coding:utf- fro ...

  7. JAVA基础--MySQL(二)

     数据库约束 1.基础限制 ① 单一表内字节量总和不能超过65535,null 占用一个字节空间 ② varchar存储255 以内字节占用一个字节表示长度,255以上自己则占用两个字节表示长度 ③ ...

  8. Python中的异步任务队列 arq

    引言 最近在用 sanic 写东西,所有涉及到IO阻塞的代码都需要用 aio 的模块,好在近年来 asyncio 生态圈发展的还算不错,该有的都有 ~ 近期业务中 登录/注册 业务涉及的很复杂(涉及到 ...

  9. nuxt项目服务端渲染应用部署、使用pm2守护进程及遇到的问题处理

    服务端渲染应用部署应该先编译构建,然后再启动 Nuxt 服务,可通过以下两个命令来完成: nuxt build nuxt start 我们已经在pakage.json里配置好script命令 { &q ...

  10. vs2017添加区域或者视图出错

    删除以下文件的信息:C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files