ZOJ的博弈题目,主角是哆啦A梦和多啦美,下面简称为A和B

游戏背景是两个人相互取石子,石子有黑白两种颜色,每个人只能去对应颜色的石子。谁不能操作就算输。

游戏规则

1 A只能拿白色的石头,也就是w的石头,B只能拿黑色的石头,也就是b的石头。

2每个人每次只能拿走一块石头

3 每堆石头块最多有两块石头,玩家有两种取石头的方式,可以从石头块的上面拿,也可以从石头快的下面拿。如果从下面拿,那么这一堆石头块就会消失,此时最底下上面那块石头会消失。这是关键。

题目的输入数据:首先输入石头块的种类N,简单排列一下知道有 b, w wb,bw,aa,bb这六种。

字符串从左到右代表石头块从上到下的顺序。

接下来N行,每一行一个字符串和数字,代表石头块的种类和数量。

最后问你A先手和后手的胜负情况。

首先分析下情况:在给定的情况下,每个人可以操作的步数(或者说回合数)基本可以确定。

那么谁的可操作数大,那么谁就可以在对方用尽操作步数以后获胜。

那么最后问题就简化为,说的可操作步数多,谁赢。这一点比较容易想到。

解题关键是上面说的关键部分,当拿走最底下一块以后这堆石头会消失,那么对方就会少一种可以操作的方式。

这样每次可操作步数,会受到对方选择而改变。

但这也是解题的思路。

当对方拿走wb这堆石头,我就少了一个w可以拿,那我的可以操作的步数就少了,这样的情况对我不利。那么轮到我操作的时候,我就拿bw的石堆。这样对方可以操作的步数也少了。这样情况就趋于平衡。

最后场面只会有两种情况,纯色的黑白石堆和多的wb石堆或者bw石堆。

这时候,情况就大大简化,统计下双方可以操作的步数就可以知道谁赢。

假设最后只有wb有X堆,我先手的情况下可以操作(X+1)/2次,后手的情况下可以操作X/2次;

假设最后只有bw有Y堆,我先手的情况下可以操作(Y+1)/2次,后手的情况下可以操作Y/2次。

到这里,代码就比较容易写了。混合的情况如上面所说的,纯色的情况下,一个石头算一次操作步数。

其他人的博客我也看过,ans1和ans2的处理是把多种情况混合在一起,这样难得理解点。

我尽量把代码写的通俗易懂,更容易理解。

#include<iostream>
#include<cstdio>
#include<functional>
#include<algorithm>
#include<cstring>
using namespace std;
long long bb,ww,wb,bw;
char s[10];
int n;
void fprint(long long x,long long y)//先手的情况
{if(x>y)printf("win ");elseprintf("lose ");
}
void sprint(long long x,long long y)//后手的情况
{if(x>=y)printf("win\n");elseprintf("lose\n");
}
int main()
{int i,j,len;long long ans1,ans2,a;while(scanf("%d",&n)!=EOF){bb=ww=wb=bw=0;//统计数据清零for(i=1;i<=n;i++){scanf("%s %lld",&s,&a);//输入len=strlen(s);if(len==1)//统计单个石头的情况{if(s[0]=='b')bb+=a;elseww+=a;}else//统计两个石头的情况{if(s[0]=='b'&&s[1]=='b')bb+=2*a;else if(s[0]=='w'&&s[1]=='w')//纯色石子统计ww+=2*a;else if(s[0]=='b'&&s[1]=='w')bw+=a;else if(s[0]=='w'&&s[1]=='b')//混合石子统计wb+=a;}}if(bw==wb)//计算最后是哪一种混合石堆剩下bw=wb=0;else if(bw>wb)bw-=wb, wb=0;elsewb-=bw, bw=0;if(bb==ww)//只用算多出的部分,可以缩减一下数据范围bb=ww=0;else if(bb>ww)bb-=ww, ww=0;elseww-=bb, bb=0;if(bw==wb){fprint(ww,bb);sprint(ww,bb);}else if(bw>wb)//ans1值没有改变,可以省略一个,这样写容易看{//wb=0ans1=ww+bw;//bw这种石堆都可以拿ans2=bb+bw/2;//后手只能拿一半fprint(ans1,ans2);//输出先手的情况ans1=ww+bw;//我后手ans2=bb+(bw+1)/2;//对于别人来说是先手sprint(ans1,ans2);//输出后手的情况}else//ans2值没有改变,可以省略一个,这样写容易看{//bw=0ans1=ww+(wb+1)/2;//理由同上ans2=bb+wb;fprint(ans1,ans2);ans1=ww+wb/2;ans2=bb+wb;sprint(ans1,ans2);}}return 0;
}

其他人的博客,写法大致相同,ans1和ans2处理

ZOJ 3452 Doraemon's Stone Game(博弈)相关推荐

  1. ZOJ 3449 Doraemon's Number Game III

    ZOJ   3449   Doraemon's Number Game III    题目链接 组队赛的一个题,只能说自己太菜,完全不知道有数根这个东西... 题意:   把一个十进制的数,写成按b进 ...

  2. ZOJ 3447 Doraemon's Number Game(优先队列+高精度运算)

    Doraemon and Nobita are playing a number game. First, Doraemon will give Nobita Npositive numbers. T ...

  3. ZOJ 3450 Doraemon's Railgun (DP·分组背包)

    题意  多啦A梦有一个超电磁炮  然后要打死n堆敌人  在同一条射线上的敌人只有先打死前面的一堆才能打后面的一堆  给你打死某堆敌人需要的时间和这堆敌人的人数   问你在T0时间内最多打死多少个敌人 ...

  4. poj 1740 A New Stone Game 博弈

    题目来源: http://poj.org/problem?id=1740 分析: 均势为:  偶数堆,且 x,x, y,y,z,z... 即先人无论怎么取,后人跟先人一个走法,那么后人一定取最后一堆. ...

  5. UVA - 1378 A Funny Stone Game(博弈+sg函数)

    题目链接:点击查看 题目大意:给出n堆石子,两人轮流按照规则操作,不能操作的一方即为输 规则:每次将第i堆减少一个石子,将第j堆和第k堆增加一个石子,i,j,k满足(i<j<=k) 若先手 ...

  6. ZOJ - 3450 Doraemon's Railgun (dp)

    https://vjudge.net/problem/ZOJ-3450 题意 一座位落(X0,Y0)的城市将遭受n个敌人的摧残.现在我们手上有某科学的超电磁炮,每次攻击都是一条射线,对于共线的敌人,必 ...

  7. D. Tokitsukaze, CSL and Stone Game(博弈)

    Problem - D - Codeforces 时津风和CSL正在玩一个石头的小游戏. 一开始,有n个石子堆,其中第ii堆有aiai石子.两位玩家轮流走棋.时津风先走.每一回合,棋手选择一个非空的棋 ...

  8. ZOJ Monthly, November 2012

    A.ZOJ 3666 Alice and Bob 组合博弈,SG函数应用 #include<vector> #include<cstdio> #include<cstri ...

  9. ZOJ 3964Yet Another Game of Stones 扩展尼姆博弈

    ZOJ 3964Yet Another Game of Stones 扩展尼姆博弈 题意 思路 Code 传送门: 题意 给n堆石头,每堆石头有a个数量和b性质.Alice和Bob玩游戏,每次只能在一 ...

最新文章

  1. 解决IDEA使用lombok注解无效,@Data不生效问题
  2. 查看LoadRunner脚本请求日志和服务器返回值方法
  3. 面向对象编程 object oriented programming(OOP)
  4. 私人博客定制----封装数据库接口
  5. 13种重要的云原生工具,让交付过程更快
  6. Could not create the view An unexpected exception……的问题
  7. pet缩聚流程图_PET生产工艺流程分解.ppt
  8. SSH框架总结(框架分析+环境搭建+实例源码下载)
  9. 8天入门wpf—— 第四天 模板
  10. Vue之代码自动格式化
  11. 【数论】Concatenated Multiples【codeforces-Round #506-div3-D】
  12. Java api监控_网站api监控、api监控教程详解
  13. MySQL更新数据语句
  14. Droid razr xt910 tegra2 地牢猎人2 dungeon hunter2
  15. 【转】中国人唯一不认可的成功——就是家庭的和睦,人生的平淡
  16. linux怎样保存文件,linux不能保存文件如何解决
  17. 知物由学 | 再造巴别塔,我们如何进行NLP跨语言知识迁移?
  18. 最美十大爱情经典句子
  19. 【信号】用matlab实现一维信号的高斯滤波
  20. 编程中最神奇的数字,你知道吗?

热门文章

  1. iOS 清除缓存封装
  2. Canal原理及其使用
  3. Activity生命周期详解
  4. Linux基础(3)/用户及文件权限管理
  5. tomcat无法访问webapps下的项目问题
  6. mcmc matlab 人大,mcmc.in.matlab 使用matlab工具完成mcmc(马尔科夫蒙托卡罗)方法的计算 - 下载 - 搜珍网...
  7. 距离6月18日DAMA-CDGA/CDGP认证考试还有31天,报名从速
  8. mysql 汉明距离检索_汉明距离海量数据算法
  9. 产品经理应该了解的心理学(下)
  10. 【zTree小贴士】树节点的图标不显示