<传送门>

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. elasticsearch集群搭建-windows

    1.下载elasticsearch到本地并解压 下载地址: https://www.elastic.co/cn/downloads/elasticsearch 解压之后复制两份,node1当作主节点, ...

  2. MongoDB中4种日志的详细介绍

    前言 任何一种数据库都有各种各样的日志,MongoDB也不例外.MongoDB中有4种日志,分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些日志记录着MongoDB数据库不同 ...

  3. 大文件断点续传插件webupload插件

    java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接 ...

  4. RPM包——查询

    1.rpm -q (1)    查询是否已经安装某一个rpm包: 例如:rpm -q httpd (2)-qa:查询所有的已经安装的包: 2.查询软件包的详细信息: rpm -qi -i :查询软件包 ...

  5. Vue与REACT两个框架的区别和优势对比

    VUE和REACT两个JavaScript框架都是当下比较受欢迎的,他们两者之间的区别有那些,各自的优缺点是什么,本文将为你呈现. 简单介绍 除非你最近一直不关注前端的发展,不然你肯定听说过由Face ...

  6. zabbix监控nginx,mysql,java

    zabbix 支持的主要监控方式(1)agent代理程序 在Agent监控方式下,zabbix-agent会主动收集本机的监控信息并通过TCP协议与zabbix-server传递信息.Agent 监控 ...

  7. 【译文】走出Java ClassLoader迷宫 Find a way out of the ClassLoader maze

    本文是一篇译文.原文:Find a way out of the ClassLoader maze 对于类加载器,普通Java应用开发人员不需要了解太多.但对于系统开发人员,正确理解Java的类加载器 ...

  8. vmware ubuntu16 启动蓝屏屏幕闪

    vmware ubuntu16 启动蓝屏屏幕闪 虚拟机安装了ubuntu16 desktop,没有关闭自动更新: 结果关机虚拟机时出现等5秒更新,类似win10关机更新: 再开机发现就蓝屏了,多次重启 ...

  9. Mac Mini 2014 更换SSD 升级SSD

    将自己的Mac Mini 2014版升级成固态硬盘 亲自动手, 还算顺利, 参考网络教程, 并改进了里面的关键步骤, 下面是原文链接 Mac Mini 2014 升级成SSD Mac Mini 拆机图 ...

  10. LiteIDE 设置默认编译输出位置

    go build命令默认输出路径是当前工作路径,这个显得比较乱,我习惯于把输出文件放置在项目的build目录下,这样方便查找,已经同步备份的时候排除不必要的文件. go build命令可以指定-o 输 ...