option=com_onlinejudge&Itemid=8&page=show_problem&problem=4332" target="_blank" style="">题目链接: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(博弈)的更多相关文章

  1. UVA 1557 - Calendar Game(博弈dp)

    UVA 1557 - Calendar Game 题目链接 题意:给定一个日期,两个人轮流走,每次能够走一月或者一天,问最后谁能走到2001.11.4这个日子 思路:记忆化搜索,对于每一个日期,假设下 ...

  2. UVA 1558 - Number Game(博弈dp)

    UVA 1558 - Number Game 题目链接 题意:20之内的数字,每次能够选一个数字,然后它的倍数,还有其它已选数的倍数组合的数都不能再选,谁先不能选数谁就输了,问赢的方法 思路:利用dp ...

  3. Crazy Calendar (阶梯博弈变形)

    2011 was a crazy year. Many people all over the world proposed on 11-11-11, married on 11-11-11, som ...

  4. UVA 12293 - Box Game(博弈)

    UVA 12293 - Box Game 题目链接 题意:两个盒子,一開始一个盒子有n个球.一个仅仅有1个球,每次把球少的盒子中球消掉,把多的拿一些球给这个盒子.最后不能操作的输(球不能少于1个),A ...

  5. UVA 10891 区间DP+博弈思想

    很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态 ...

  6. UVA 10561 - Treblecross(博弈SG函数)

    UVA 10561 - Treblecross 题目链接 题意:给定一个串,上面有'X'和'.',能够在'.'的位置放X.谁先放出3个'X'就赢了,求先手必胜的策略 思路:SG函数,每一个串要是上面有 ...

  7. HDU 1079 Calendar Game 博弈

    题目大意:从1900年1月1日 - 2001年11月4日间选择一天为起点,两个人依次进行两种操作中的任意一种,当某人操作后为2001年11月4日时,该人获胜.问先手是否获胜 操作1:向后移一天 操作2 ...

  8. HDU 1079 Calendar Game (博弈或暴搜)

    题意:给定一个日期,然后 A 和 B 双方进行操作,谁先把日期变成2001年11月04日,将获胜,如果超过该日期,则输了,就两种操作. 第一种:变成下一天,比如现在是2001.11.3 变成 2001 ...

  9. LightOJ 1393 Crazy Calendar(博弈)题解

    题意:r*c方格中,每个格子有一定石子,每次移动每格任意数量石子,只能向下或者向右动一格,不能移动为败 思路:显然是Nim,到右下曼哈顿距离为偶数的不用管,因为先手动一下后手动一下最后移到右下后还是先 ...

随机推荐

  1. 2006 ACM Northwestern European Programming Contest C题(二分求最大)

    My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I have a numberN o ...

  2. vim Diff,Easy,Read-Only 的区别

    我用的是vim 7.4,在windows上面安装完 vim 之后会出现不同的vim图标,gVim ,vim gVim 是在windows下的Gui图形用户界面的的 vim (GUI Vim),支持wi ...

  3. CImage类

    CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素.这里介绍GDI+和CImage的一般使用方法和技巧. TAG: GDI  CImage  后处理   我们知道,Vi ...

  4. Dom4j SAXReader Constructors

    Dom4j读取xml:eg1: package xml; import java.io.File; import org.dom4j.DocumentException; import org.dom ...

  5. Unity3d 4.3.4f1执行项目

    今天.本来执行的非常快的一个项目. 忽然打开非常晚.尝试新建一个新的项目,竟然执行速度非常快. 心有不忿的,把整个Unity删除了.又一次安装. 再打开那个执行变慢的项目. 结果.执行速度回来了. 不 ...

  6. 2388 Who&#39;s in the Middle(简单排序)

    训练计划的第一个问题,首先从水问题开始:排序的数组,中间数则输出. http://poj.org/problem?id=2388 冒泡排序: #include <iostream> usi ...

  7. tar.gz文件命名和压缩解压方法

    tar.gz文件命名 tar这是文件打成一个包,无压缩; gz同gzip标记的包.tar文件压缩; 所以它成为一个.tar.gz档 压缩 # tar cvfz backup.tar.gz /xxx/ ...

  8. tmpfs(/dev/shm)

    tmpfs是一种基于内存的文件系统,它和虚拟磁盘ramdisk比较类似像,但不完全相同,和ramdisk一样,tmpfs可以使用RAM,但它也可以使用swap分区来存储.而且传统的ramdisk是个块 ...

  9. 【前段开发】10步掌握CSS定位: position static relative absolute float

    希望能帮到须要的人,转自:http://www.see-design.com.tw/i/css_position.html 1. position:static 元素的 position 屬性默認值為 ...

  10. 1.VMwareTools安装

     1 选中虚拟机.右击.然后点击:安装Vmware-tool(最好是有网络的情况下安装) 2 将Vmware-tool的安装文件复制到暂时文件夹下,截图例如以下: 3 解压VMwareTools- ...