题目链接:点击查看

题目大意:给出一个日期,两个人轮流按照规则操作,具体规则如下:

  1. 每次可以增加一天
  2. 每次可以增加一个月到下一个月的当天

首先到达2001年11月4日的人获胜,问谁能获胜

题目分析:因为是从1900年1月1日开始的,最多只跨越了100年,也就是100*365天,大概也就1e5的分支,我们可以直接用dfs进行sg打表,每一次至多有两个分支,可以用两个if套上好多个if else就好了。。这样的话时间复杂度我不太会算,但因为用了sg打表,也相当于是记忆化搜索了,避免了重复分支的多次调用,所以交上去之后15毫秒就过了,还要吐槽一点,我的笔记本太不给力了。。在本地T掉了,本来很失望的交上去却A掉了,emmm

最后再感谢zx学长的思路,直接上代码了:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=4e5+100;int sg[2020][15][35];//sg函数,类似于记忆化搜索const int mon[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};bool is_year(int year)//判断是否为闰年
{if(year%4==0&&year%100!=0||year%400==0)return true;return false;
}bool check(int a,int b,int c)//判断是否越界
{if(a>2001||a==2001&&b>11||a==2001&&b==11&&c>4)return false;return true;
}bool dfs(int a,int b,int c)//记忆化搜索
{if(sg[a][b][c]!=-1)return sg[a][b][c];if(a==2001&&b==11&&c==4)return sg[a][b][c]=false;int pos=is_year(a);if(c<mon[pos][b]&&check(a,b,c+1))//下一天 {if(!dfs(a,b,c+1))return sg[a][b][c]=true;}else if(c==mon[pos][b]&&b!=12&&check(a,b+1,1))//跨月不跨年 {if(!dfs(a,b+1,1))return sg[a][b][c]=true;}else if(c==mon[pos][b]&&b==12&&check(a+1,1,1))//跨年{if(!dfs(a+1,1,1))return sg[a][b][c]=true;} if(b<12)//下一个月的同一天{if(c<=mon[pos][b+1])//确保下一个月中有这一天 if(check(a,b+1,c))if(!dfs(a,b+1,c))return sg[a][b][c]=true;}else if(b==12)//跨年{if(check(a+1,1,c))//12月和1月都是31天,所以不用特判 if(!dfs(a+1,1,c))return sg[a][b][c]=true;} return sg[a][b][c]=false;
}int main()
{
//  freopen("input.txt","r",stdin);memset(sg,-1,sizeof(sg));int w;cin>>w;while(w--){int a,b,c;scanf("%d%d%d",&a,&b,&c);if(dfs(a,b,c))printf("YES\n");elseprintf("NO\n");}return 0;
}

HDU - 1079 Calendar Game(博弈打表sg函数)相关推荐

  1. 博弈问题及SG函数(真的很经典)

    博弈问题 若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需 ...

  2. 三个常见博弈游戏以及 SG 函数和 SG 定理

    前言 原文章 通过数论或者自然数性质完美解决的三个常见博弈游戏: 博弈 解决方法 Bash Game 同余理论 Nim Game 异或理论 Wythoff Game 黄金分割 Bash Game 描述 ...

  3. 博弈问题及SG函数(怒赞,耐心地仔细看一定能看懂)

    博弈问题 若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需 ...

  4. (转)博弈问题与SG函数

    博弈问题 若你想仔细学习博弈论,我强烈推荐加利福尼亚大学的Thomas S. Ferguson教授精心撰写并免费提供的这份教材,它使我受益太多.(如果你的英文水平不足以阅读它,我只能说,恐怕你还没到需 ...

  5. 【NOI模拟赛】纸老虎博弈(博弈论SG函数,长链剖分)

    题面 某天,C 和 K 觉得很无聊,于是决定玩一个经典小游戏: 在一棵有 nnn 个结点的有根树上,标号为 iii 的节点上有 aia_iai​ 个棋子.游戏时玩家轮流操作,每次可以将任意一个节点 u ...

  6. HDU 1079 Calendar Game (日期博弈,真是日历都快被我走遍了...)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1079 题面: Calendar Game Time Limit: 5000/1000 MS (Java ...

  7. HDU 1079 Calendar Game (博弈)

    转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove 题目:每次可以后移一个月,或者后移 ...

  8. HDU - 1847 Good Luck in CET-4 Everybody!(sg函数,水题)

    题目链接:点击查看 题目大意:给出n张牌,两个人轮流摸牌,每次只能摸2的幂次,问先手必胜还是必败 题目分析:简单sg打表题,先预处理出sg表,然后O(1)查询即可 #include<iostre ...

  9. HDU 1848 SG函数

    这题运用博弈中的SG函数解决的,感觉初级博弈题用这个很好用但是难一些的还是不会求SG值,就是SG的模板题. #include <iostream> #include<cstdio&g ...

最新文章

  1. transactionscope 中的异步 处理 异常_.NET Core中TransactionScope事务处理方法介绍及注意事项...
  2. 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决
  3. 什么是async、await?
  4. 海量数据处理利器greenplum——初识
  5. java中wait和sleep的区别
  6. POJ1661 Help Jimmy(dp)
  7. 【英语学习】【WOTD】resuscitate 释义/词源/示例
  8. 保险的现金价值是什么意思?
  9. 为什么电商越来越难做了?
  10. linux 配置用户密码,Linux ——用户密码相关设置
  11. Ubuntu 18安装谷歌浏览器
  12. jQuery EasyUI 简介
  13. 在阿里云容器服务中使用定时任务
  14. PLC单按钮启停电路与特殊辅助继电器
  15. html读写txt文件,JS读写文本文件示例代码
  16. 【APP自动化测试必知必会】Appium之微信小程序自动化测试
  17. visio中使用连接线连接形状
  18. 2D激光雷达的多传感器拼接
  19. 综述论文要写英文摘要吗_攻略|一些小论文撰写的建议
  20. Java Web之过滤器的简单创建

热门文章

  1. mybatis-翻页
  2. Actuator提供的endpoint
  3. 用户中心 - 修改用户信息
  4. 设计模式------代理模式
  5. SpringBoot 数据验证错误处理
  6. 实例对象的属性和原型对象中的属性重名问题 神奇的原型链 继承 继承案例
  7. android开发版本,Android开发之版本统一规范
  8. 两个列表合并去重_数据结构——列表
  9. Workbooks 对象的 Open 方法参数说明
  10. 聊聊flink的Async I/O