版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/DADDY_HONG/article/details/84928732
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;
}