uva 1557 - Calendar Game(博弈)
题目大意:给定一个日期,每次能够选择加一个月,或者加一天,加一个月的前提是下一个月有相应的日期,比方1.30加一个月变成2.30是不合法的。日期上限为2001.11.4。两个人轮流操作。不能操作为失败。
解题思路:dp[y][m][d]表示相应日期是否为先手必胜。
预先处理就可以,注意细节,包含闰年等。分享代码。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Y = 105;
const int D = 15;
const int M = 35;
const int month[D] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int dp[Y][D][M];
bool is_year (int y) {
if (y % 100 == 0 && y % 400 == 0)
return true;
if (y % 4 == 0 && y % 100)
return true;
return false;
}
int get_day (int y, int m) {
if (y == 2001 && m == 11)
return 4;
if (m == 2 && is_year(y))
return 29;
return month[m];
}
bool judge_day (int y, int m, int d) {
if (y > 101)
return false;
if (y == 101 && m > 11)
return false;
if (y == 101 && m == 11 && d > 4)
return false;
return true;
}
bool getnext_day (int& yy, int& mm, int& dd, int y, int m, int d, int type) {
if (type) {
dd = d;
mm = m + 1;
if (mm > 12) {
yy = y + 1;
mm = 1;
} else
yy = y;
if (dd > get_day(yy + 1900, m))
return false;
} else {
dd = d + 1;
if (dd > get_day(y + 1900, m)) {
dd = 1;
mm = m + 1;
} else
mm = m;
if (mm > 12) {
yy = y + 1;
mm = 1;
} else
yy = y;
}
return judge_day(yy, mm, dd);
}
int SG (int y, int m, int d) {
if (dp[y][m][d] != -1)
return dp[y][m][d];
dp[y][m][d] = 0;
int yy, mm, dd;
if (getnext_day(yy, mm, dd, y, m, d, 0)) {
if (SG(yy, mm, dd) == false)
dp[y][m][d] = 1;
}
if (getnext_day(yy, mm, dd, y, m, d, 1)) {
if (SG(yy, mm, dd) == false)
dp[y][m][d] = 1;
}
return dp[y][m][d];
}
void init () {
memset(dp, -1, sizeof(dp));
dp[101][11][4] = 0;
for (int i = 0; i <= 101; i++) {
int limit_month = (i == 101 ?
11 : 12);
for (int j = 1; j <= limit_month; j++) {
int limit_day = get_day(1900+i, j);
for (int d = 1; d <= limit_day; d++)
SG(i, j, d);
}
}
}
int main () {
init();
int cas, y, m, d;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d%d", &y, &m, &d);
printf("%s\n", dp[y-1900][m][d] ?
"YES" : "NO");
}
return 0;
}
uva 1557 - Calendar Game(博弈)的更多相关文章
- UVA 1557 - Calendar Game(博弈dp)
UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...
- UVA 1558 - Number Game(博弈dp)
UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...
- Crazy Calendar (阶梯博弈变形)
2011 was a crazy year. Many people all over the world proposed on 11-11-11, married on 11-11-11, som ...
- UVA 12293 - Box Game(博弈)
UVA 12293 - Box Game 题目链接 题意:两个盒子,一開始一个盒子有n个球.一个仅仅有1个球,每次把球少的盒子中球消掉,把多的拿一些球给这个盒子.最后不能操作的输(球不能少于1个),A ...
- UVA 10891 区间DP+博弈思想
很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态 ...
- UVA 10561 - Treblecross(博弈SG函数)
UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...
- HDU 1079 Calendar Game 博弈
题目大意:从1900年1月1日 - 2001年11月4日间选择一天为起点,两个人依次进行两种操作中的任意一种,当某人操作后为2001年11月4日时,该人获胜.问先手是否获胜 操作1:向后移一天 操作2 ...
- HDU 1079 Calendar Game (博弈或暴搜)
题意:给定一个日期,然后 A 和 B 双方进行操作,谁先把日期变成2001年11月04日,将获胜,如果超过该日期,则输了,就两种操作. 第一种:变成下一天,比如现在是2001.11.3 变成 2001 ...
- LightOJ 1393 Crazy Calendar(博弈)题解
题意:r*c方格中,每个格子有一定石子,每次移动每格任意数量石子,只能向下或者向右动一格,不能移动为败 思路:显然是Nim,到右下曼哈顿距离为偶数的不用管,因为先手动一下后手动一下最后移到右下后还是先 ...
随机推荐
- Linux学习记录--匿名沟通渠道
匿名沟通渠道 管道Linux最初支持Unix IPC其中的一种形式.具有下列特征: 1.管道是半双工.数据可以仅在一个方向流动:当双方需要沟通.建设两条管线需要. 2.仅仅能用于父子进程或者兄弟进程之 ...
- Lucene.Net 2.3.1开发介绍 —— 二、分词(二)
原文:Lucene.Net 2.3.1开发介绍 -- 二.分词(二) 1.2.分词的过程 1.2.1.分词器工作的过程 内置的分词器效果都不好,那怎么办?只能自己写了!在写之前当然是要先看看内置的分词 ...
- 使用elk+redis搭建nginx日志分析平台(转)
logstash,elasticsearch,kibana 怎么进行nginx的日志分析呢?首先,架构方面,nginx是有日志文件的,它的每个请求的状态等都有日志文件进行记录.其次,需要有个队列,re ...
- [置顶] 关于redhat系统yum源的配置1
安装过Linux软件的用户就知道,有时我们安装一个软件,需要依赖其他软件,所以必需找全所有的软件,这是一个极其麻烦的事情,有没什么方式可以让它自己去找依赖呢? 答案当然是肯定,这就需要我们配置一个神器 ...
- Android学习4、Android该Adapter
一.Adapter介绍 An Adapter object acts as a bridge between an AdapterView and the underlying data for th ...
- UpdataData
MFC中有一个UpdataData函数,有二个参数:TRUE和FLASE,二个参数什么时候用, 开始的时候我也迷糊,后来才发现: UpdataData(TRUE):是把控件上的值刷新到变量中: Upd ...
- div仿checkbox表单样式美化及功能
div仿checkbox表单样式美化及功能(checkbox的样式不好看)素材在底部: 效果图: window.css .bj { position: absolute; top: 0; left: ...
- Linux 之 rsyslog
Linux 之 rsyslog 系统日志转发 一.rsyslog 介绍 ryslog 是一个快速处理系统日志的程序,提供了高性能.安全功能和模块化设计.rsyslog 是syslog 的升级版,它将多 ...
- C strstr() 函数
包含文件:string.h 函数名: strstr 函数原型:extern char *strstr(const char *str1, const char *str2); 语法:* strstr( ...
- 管理处理器的亲和性(affinity)
管理处理器的亲和性(affinity) 管理处理器的亲和性(affinity)