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,到右下曼哈顿距离为偶数的不用管,因为先手动一下后手动一下最后移到右下后还是先 ...
随机推荐
- 英特尔的VT-d技术是什么?
VT-d技术: 我们知道对于服务器而言,很重要的一个组成部分就I/O,CPU的计算能力提升虽然可以更快地处理数据,但是前提是数据能够顺畅的到达CPU,因此,无论是存储,还是网络,以及图形卡.内存等,I ...
- java开发异常类型汇总
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- C++中出现的计算机术语1
access labels(訪问标号) 类的成员能够定义为 private,这能够防止使用该类型的代码訪问该成员. 成员还能够定义为 public,这将使该整个程序中都可訪问成员. address( ...
- [置顶] Vim用正则表达式进行批量修改
vim可以设置 magic 这个东西, magic就是设置哪些元字符要加反斜杠哪些不用加的. 简单来说: magic(\m):除了 $ . * ^ 之外其他元字符都要加反斜杠. nomagic(\M) ...
- ExtJs4 笔记(1) ExtJs大比拼JQuery:Dom文档操作
现在主流的JS框架要数ExtJs和JQuery应用的比较广泛.JQuery属于轻量级的,一般做网站应用比较常见,可见块头小的优势.ExtJs比较庞大,它除了对基本的JS语法和HTML DOM操作方式的 ...
- Jetty开发指导:HTTP Client
介绍 Jetty HTTP client模块提供易用的API.工具类和一个高性能.异步的实现来运行HTTP和HTTPS请求. Jetty HTTP client模块要求Java版本号1.7或者更高,J ...
- Fragment总结
一.总体工程图: 二.main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- 从零开始学C++之从C到C++(二):引用、内联函数inline、四种类型转换运算符
一.引用 (1).引用是给一个变量起别名 定义引用的一般格式:类型 &引用名 = 变量名: 例如:int a=1; int &b=a;// b是a的别名,因此a和b是同一个单元 注 ...
- API - 微云
API - 微云 1.接口说明 2.数据上传协议说明 1. 接口说明 文件上传申请,成功会返回实际上传的地址. 根据申请上传返回的地址,组织数据上传. 1.1 URL OAuth2.0协议: http ...
- 全国各大 oj 分类题集...
各种题集从易到难刷到手软 你准备好了吗? 准备剁手吧