[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 ...
随机推荐
- java数字转字符串前面自动补0或者其他数字
/** * Java里数字转字符串前面自动补0的实现. * * @author xiaomo * */ public class TestStringFormat { public ...
- 【codeforces】【比赛题解】#948 CF Round #470 (Div.2)
[A]Protect Sheep 题意: 一个\(R*C\)的牧场中有一些羊和一些狼,如果狼在羊旁边就会把羊吃掉. 可以在空地上放狗,狼不能通过有狗的地方,狼的行走是四联通的. 问是否能够保护所有的羊 ...
- csv导入mysql提示错误[Error Code] 1290 - The MySQL server is running with the --secure-file-priv option 解决方法【转】
解决方法: 1.进入mysql查看secure_file_prive的值 mysql>SHOW VARIABLES LIKE "secure_file_priv"; secu ...
- 七、springboot整合Spring-data-jpa
1.Spring Data JPA是什么 由Spring提供的一个用于简化JPA开发的框架.可以在几乎不用写实现的情况下,实现对数据的访问和操作.除了CRUD外,还包括如分页.排序等一些常用的功能 1 ...
- Owin WebApi版本控制
public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey ...
- docker修改docker0 mtu
由于docker宿主机设置了mtu造成docker镜像中mtu和宿主机mtu不匹配,大包后网络不同.所以需要设置docker0的mtu. 1.修改docker.service vi /usr/lib/ ...
- java基础48 IO流技术(序列流)
本文知识点目录: 1.SequenceInputStream序列流的步骤 2.实例 3.附录(音乐的切割与合并) 1.SequenceInputStream序列流的步骤 1.找到目标文件 ...
- [USACO16OPEN]248
传送门啦 分析: 一个裸的区间dp,我们只需要注意合并的时候并不像2048那样加倍,每次都加1就好了 #include <iostream> #include <cstring> ...
- AdvStringGrid 获取值
stringGrid.row stringgrid.col分别为当前行和列 stringGrid.cells[stringgrid.col,stringGrid.row]就是当前cell的值 ---- ...
- Centos7配置vsftpd3.0.2
1.安装vsftpd vsftp使用本地用户登陆方式 yum -y install vsftpd yum安装的版本3.0.2 2.配置vsftpd vim /etc/vsftpd/vsftpd.con ...