博弈论 (入门)CSU2209 记忆化搜索

3 篇文章 0 订阅
3 篇文章 0 订阅

2209: Game

Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 256 Mb     Submitted: 10     Solved: 5    


Description

xrdog有一个有趣的算式 a^X+b*Y^2≥C

现给定a,b和c,且初始的时候X=Y=0,xrdog和小砖准备玩一个游戏。游戏规则是这样子的:

Xrodg和小砖轮流进行操作,xrdog进行第一次操作。 每一次操作xrdog或小砖可以选择把X加一,或者把Y加一。如果某人操作完后使得算式成立了,那么此人就输了。 小砖现在想知道她是否能赢呢,你能帮帮她吗?

(注意:xrdog和小砖都无比聪明,他们都会选择最优策略)

Input

一行三个非负整数(a≤10^3),b(b≤10^3)和 c(2≤c≤10^9)

Output

若小砖能赢输出1

若小砖无法取胜输出0

若是平局(即不会有人失败)则输出-1

Sample Input

2 2 2

Sample Output

1

 

博弈论入门题目,想想能得出。

xrdog操作时,只有x+1或y+1都无法得到胜局时才是小砖的胜局。否则先手必胜。

而小砖操作时,只要x+1或y+1能有得到胜局的,就是小砖的胜局。

 

超时了一发,蠢了只用了暴力dfs,应记忆化搜索,有些是进行了重复的计算。

WA了一发,条件没有想清楚,如果a==1或者a==0或者b==0,均能够一直加x或y而不增加算式的值,此时无法分出胜负。

 

#include <cstdio>
#include <cstring>
#include <cmath>

const int maxn=1e3+10;

long long a,b,c;
long long z;
int flag[maxn][maxn];

//记忆化搜索
bool dfs(int x,int y,int cnt)
{
    if(flag[x][y]!=-1){
        return flag[x][y];
    }
    if(pow(a,x)+b*y*y>=c){
        flag[x][y]=0|(cnt%2);
        return flag[x][y];
    }
    else{
        if(cnt%2==1){
            return flag[x][y]=dfs(x+1,y,cnt+1)&&dfs(x,y+1,cnt+1);
        }
        else{
            return flag[x][y]=dfs(x+1,y,cnt+1)||dfs(x,y+1,cnt+1);
        }

        return 0;
    }
}

int main()
{
    memset(flag,-1,sizeof(flag));

    scanf("%lld%lld%lld",&a,&b,&c);
    z=c;
    if(a<=1||b==0){ //!
        printf("-1\n");
    }else{
        if(dfs(0,1,1)&&dfs(1,0,1)){
            printf("1\n");
        }
        else printf("0\n");
    }

    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值