[POJ1082]Calendar Game
题目大意:
日历上博弈,从给定的日期,按照下述规则跳转日期:
1.跳到第二天;
2.调到下个月相同的日期(如果没有就不能跳转)。
刚刚好跳到2001年11月4日的人胜,跳转时不能跳到2001年11月4日以后。
现在A和B轮流跳,问A是否有必胜策略。
思路:
如果不考虑边界情况,每一个对应的日期都有两个直接相连的后继状态,也同时是两个日期直接相连的后继状态。
这样,所有的状态构成一个DAG,我们可以在DAG上进行DP。
一个状态是必败状态当且仅当它的两个前驱状态都是必胜状态。
一个状态是必胜状态当且仅当它的其中一个前驱状态是必败状态。
我们可以先预处理出所有日期所对应的状态,然后回答即可。
另外本题也有找规律的做法,设月份为m,日期为d。
则当m+d为偶数时必胜,当m+d为奇数时必败。
特别地,当m=9或11且d=30时,也为必胜状态。
#include<map>
#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
struct Date {
int y,m,d;
bool operator < (const Date &another) const {
if(y<another.y) {
return true;
} else if(y==another.y){
if(m<another.m) {
return true;
} else if(m==another.m) {
if(d<another.d) return true;
}
}
return false;
}
bool operator <= (const Date &another) const {
if(y<another.y) {
return true;
} else if(y==another.y){
if(m<another.m) {
return true;
} else if(m==another.m) {
if(d<=another.d) return true;
}
}
return false;
}
bool isleap() const {
return (!(y%)&&(y%))||!(y%);
}
int day() const {
if(m==||m==||m==||m==||m==||m==||m==) return ;
if(m==||m==||m==||m==) return ;
return isleap()?:;
}
Date decday() const {
Date ret=*this;
ret.d--;
if(!ret.d) {
ret.m--;
if(!ret.m) {
ret.y--;
ret.m=;
}
ret.d=ret.day();
}
return ret;
}
Date decmonth() const {
Date ret=*this;
ret.m--;
if(!ret.m) {
ret.y--;
ret.m=;
}
if(ret.d>ret.day()) return (Date){,,};
return ret;
}
Date incday() const {
Date ret=*this;
ret.d++;
if(ret.d>ret.day()) {
ret.m++;
if(ret.m==) {
ret.y++;
ret.m=;
}
ret.d=;
}
return ret;
}
Date incmonth() const {
Date ret=*this;
ret.m++;
if(ret.m==) {
ret.y++;
ret.m=;
}
if(ret.d>ret.day()) return (Date){,,};
return ret;
}
};
const Date begin=(Date){,,},end=(Date){,,};
std::map<Date,bool> m;
inline void dp() {
for(Date d=end;begin<=d;d=d.decday()) {
if(d.incday()<=end) {
m[d]|=!m[d.incday()];
}
if(d.incmonth()<=end) {
m[d]|=!m[d.incmonth()];
}
}
}
inline bool query(const int &y,const int &mm,const int &d) {
return m[(Date){y,mm,d}];
}
int main() {
dp();
for(register int n=getint();n;n--) {
const int &y=getint(),&m=getint(),&d=getint();
puts(query(y,m,d)?"YES":"NO");
}
return ;
}
[POJ1082]Calendar Game的更多相关文章
- poj1082 Calendar Game (博弈)
题意是:Adam和Eve两人做游戏,开始给出一个日期,截止日期是2011.11.4,游戏规则如下: 每个人只能将天数增加一天或者将月份增加一天.如果下个月没有这一天,那么只能增加天数. 游戏胜利定义为 ...
- 【POJ1082】Calendar Game (博弈)
[题目] Description Adam and Eve enter this year's ACM International Collegiate Programming Contest. La ...
- Java 时间类-Calendar、Date、LocalDate/LocalTime
1.Date 类 java.util.Date是一个"万能接口",它包含日期.时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪 ...
- Js: Extensible Calendar Examples
http://ext.ensible.comhttps://github.com/bmoeskau/Extensiblehttps://github.com/TeamupCom/extensibleh ...
- Calendar类
Calendar类 注意:根据日历规则,如果想要这个月减去5天,那么则为: add(Calendar.Day,-5) 成员方法: public int get(int field):返回给定日历段的值 ...
- This month Calendar
package fourth;import java.text.DateFormatSymbols;import java.util.*;public class CalendarTest { pub ...
- calendar的一些操作
一.通过分析日期函数,根据日期进行一系列操作,例如:我们需要知道2个时间段中所有的日期等等. 由于Calendar 类是一个抽象类,因此我们不能通过new来获取该对象的实例.我们可以通过其类方法 ge ...
- java-String Date Calendar之间的转换
1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...
- jQuery Ion.Calendar 日期/日历
在线实例 实例演示 默认 实例演示 每周第一天 实例演示 输入框插件 实例演示 HTML data 属性 实例演示 回调函数1 实例演示 回调函数2 使用方法 <div id="cal ...
随机推荐
- Nodejs 发送邮件
var nodemailer = require("nodemailer");var mailTitle='http://bemupa.forumieren.com:Best Mu ...
- Python中使用LMDB
在python中使用lmdb linux中,可以使用指令pip install lmdb安装lmdb包. 生成一个空的lmdb数据库文件 # -*- coding: utf-8 -*- import ...
- 空洞卷积(dilated Convolution) 与感受野(Receptive Field)
一.空洞卷积 空洞卷积是是为了解决基于FCN思想的语义分割中,输出图像的size要求和输入图像的size一致而需要upsample,但由于FCN中使用pooling操作来增大感受野同时降低分辨率,导致 ...
- MySQL -- SQL 语句
一. 数据库(Database)操作 创建数据库 create database 数据库名 create database 数据库名 character set 字符集 查看数据库 查看数据库服务器中 ...
- Python模块:Random(未完待续)
本文基于Python 3.6.5的官文random编写. random模块简介 random为各种数学分布算法(distributions)实现了伪随机数生成器. 对于整数,是从一个范围中均匀选择(u ...
- 【前端】h5音乐播放demo 可关闭可播放
复制如下代码,直接可预览(记得把超链接换成自己本地路径) <!DOCTYPE html> <html> <head> <meta charset=" ...
- 数据库-python操作mysql(pymsql)
pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同 一:安装pymysql pip3 install pymysql 二:使用pytmysql # -*- codin ...
- AdvStringGrid 固定行、列
- Effective STL 学习笔记 Item 16:vector, string & C API
有时需要支持 C 的接口,但这并不复杂. 对于 vector 来讲, \(v[0]\) 的地址 \(\&v[0]\) 即可作为数组指针传递给 C API: 1: // Legacy C API ...
- MST最小生成树
首先,贴上一个很好的讲解贴: http://www.wutianqi.com/?p=3012 HDOJ 1233 还是畅通工程 http://acm.hdu.edu.cn/showproblem.ph ...