博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenJudge NOI题库 6266:取石子游戏
阅读量:4316 次
发布时间:2019-06-06

本文共 995 字,大约阅读时间需要 3 分钟。

  • 本题的提示还是够详细了:
    假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法.
    [a/b]表示a除以b取整后的值.
  • 当x/y<2时,很显然只有一种取法
  • 当x/y>=2时,这时候该走的人(S)总是能赢(如果x=k*y+r,当S为状态为[r,y]的该走的人,且其最后赢家为自己,那么S先走到[r+y,y],O走到[r,y],该S走,S赢;其最后赢家为对手时,那么S先走到[r,y],该O走,那么最后的赢家就是O的对手:S)
#include
int cnt;long long n,m;void check(){ cnt=1-cnt; if(m==n||n/m>=2||m/n>=2) return ; if(n>m) n-=m; else m-=n; check();}int main(){ while(scanf("%I64d%I64d",&n,&m)&&n&&m){ cnt=0; check(); if(cnt) printf("win\n"); else printf("lose\n"); }}

一开始的代码: wa了

#include
int cnt;long long n,m;void check(){ cnt=1-cnt; if(!n||!m||n/m>=2||m/n>=2) return ; if(n>m) n-=m; else m-=n; check();}int main(){ while(scanf("%I64d%I64d",&n,&m)&&n&&m){ cnt=0; check(); if(cnt) printf("win\n"); else printf("lose\n"); }}

原因就在:if(!n||!m||n/m>=2||m/n>=2) return ; 中!n||!m将cnt向后推了一个人,会错。

转载于:https://www.cnblogs.com/katarinayuan/p/6572856.html

你可能感兴趣的文章
初始化 Flask 虚拟环境 命令
查看>>
脚本简介jQuery微信开放平台注册表单
查看>>
将PHP数组输出为HTML表格
查看>>
Java中的线程Thread方法之---suspend()和resume() 分类: ...
查看>>
经典排序算法回顾:选择排序,快速排序
查看>>
BZOJ2213 [Poi2011]Difference 【乱搞】
查看>>
c# 对加密的MP4文件进行解密
查看>>
Flask 四种响应类型
查看>>
AOP面向切面编程C#实例
查看>>
怎么让win7右下角只显示时间不显示日期 ?(可行)
查看>>
AngularJs学习笔记-慕课网AngularJS实战
查看>>
数据库三大范式
查看>>
工作总结之二:bug级别、优先级别、bug状态
查看>>
访问修饰符、封装、继承
查看>>
更换pip源到国内镜像,提升pip下载速度.
查看>>
POJ 2265 Bee Maja (找规律)
查看>>
Kendo MVVM 数据绑定(七) Invisible/Visible
查看>>
DB Intro - MySQL and MongoDB
查看>>
Practical Mathematical Handwriting
查看>>
[zz]kvm环境使用libvirt创建虚拟机
查看>>