dp --- acdream原创群赛(16) --- B - Apple
B - Apple
Problem Description
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
Each test case contains three integers N, M and A.
1 <= N <= 10,000
1 <= M <= 30
2 <= A <= 1,000,000,000
Output
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的更多相关文章
- ACdream原创群赛__15
这场感觉题目确实还算可以,不过,说好的每题10s效果上却不理想.这个时限还算比较紧.因为时间不是按绝对的多出几秒来计算,而是几倍来计算的. 比赛做的不好,后面又去做了一下. A:典型的数位DP,一直坑 ...
- ACdream原创群赛(13)のwuyiqi退役专场 C True love
True love Time Limit: 4000/2000 MS (Java/Others) Memory Limit:128000/64000 KB (Java/Others) Prob ...
- ACdream原创群赛(18)のAK's dream题解
只做了4题水题ADGI A题需要注意的就是“[...]”的输出了,何时输出,何时不输出. #include <stdio.h> int main() { int n, cur, d; ; ...
- 群赛 ZOJ3741(dp) ZOJ3911(线段树)
zoj3741 简单dp.wa了两个小时,中间改了好多细节.后来还是不对,参考了别人的代码,发现一个致命问题,初始化的时候,不是每种状态都能直接达到的.初始化成-1. (题目有个小坑,0<=L& ...
- ACdream群赛1112(Alice and Bob)
题意:http://acdream.info/problem?pid=1112 Problem Description Here is Alice and Bob again ! Alice and ...
- centos环境 使用kubeadm快速安装k8s集群v1.16.2
全程使用root用户运行,宿主机需要连接外网 浏览一下官方kubeadm[有些镜像用不了] https://kubernetes.io/docs/setup/production-environmen ...
- [原创]obj-c编程16:键值编码(KVC)
原文链接:obj-c编程16:键值编码(KVC) 我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...
- 二进制安装K8S集群V1.16.3
centos linux7.5 cat > /etc/hosts << EOF 192.168.199.221 master 192.168.199.222 node1 192.16 ...
- kubeadm部署K8S集群v1.16.3
本次先更新kubeadm快速安装K8S,二进制安装上次没写文档,后续更新,此次最新的版本是V1.16.3 1.关闭防火墙.关闭selinux.关闭swapoff -a systemctl stop f ...
随机推荐
- MongoDB 实现 create table tab2 as select
1. var result = db.foo.aggregate(...);db.bar.insert(result.result); 2. var temp1 = db.mtb1.find(name ...
- CentOS7 配置阿里云yum源,vim编辑器,tab自动补全
1.进入yum的文件夹 命令:cd /etc/yum.repos.d/ 2.下载wget 命令:yum -y install wget 3.删除yum文件夹所有yum源 命令:rm -rf ...
- JS的ES6的class
1.类的创建: 定义类 类的构造函数 类的静态方法 类的一般属性和方法 //定义类 class Person{ // 类的静态方法,相当于Person.test = function(){consol ...
- ABP 00 常用知识
1.更改本地预览的端口: 文件路径:\src\ContractMS.Web.Mvc\Properties\launchSettings.json 改这里:"applicationUrl&qu ...
- Bzoj 3343: 教主的魔法(分块+二分答案)
3343: 教主的魔法 Time Limit: 10 Sec Memory Limit: 256 MB Description 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息 ...
- 洛谷 P1144 最短路计数 题解
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 输入格式 第一行包含\(2\)个正 ...
- python 脚本接受参数
import os import sys print(sys.argv) bogon:Desktop macname$ python3 test2.py deesws.json dede.json s ...
- 利用python爬虫爬取图片并且制作马赛克拼图
想在妹子生日送妹子一张用零食(或者食物类好看的图片)拼成的马赛克拼图,因此探索了一番= =. 首先需要一个软件来制作马赛克拼图,这里使用Foto-Mosaik-Edda(网上也有在线制作的网站,但是我 ...
- Python安装依赖包及开发工具转移到Visual Studio 2019
#pip升级pip install --upgrade pip#安装pillow图形库pip install pillow #安装二维码库 pip install MyQR PyCharm工具导入依赖 ...
- SpringMVC 事件监听 ApplicationListener
1. 实现 ApplicationListener<T> 接口(T为监听类型,稍后会列出具体可监听事件) 2. 将该自定义监听类,注册为Spring容器组件.(即将该类注入Spring容器 ...