[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 ...
随机推荐
- oracle同义词是什么意思?
相当于alias,比如把user1.table1 在user2中建一个同义词table1create synonym table1 for user1.table1;这样当我们在user2中查sele ...
- C#利用System.Net发送邮件
啥也不说了,直接上干货 using System.Net.Mail;using System.Net; //使用发送邮件的邮箱 var emailAcount = "826217795@qq ...
- Pytorch自定义数据库
1)前言 虽然torchvision.datasets中已经封装了好多通用的数据集,但是我们在使用Pytorch做深度学习任务的时候,会面临着自定义数据库来满足自己的任务需要.如我们要训练一个人脸关键 ...
- Python爬虫学习1: Requests模块的使用
Requests函数库是学习Python爬虫必备之一, 能够帮助我们方便地爬取. Requests: 让HTTP服务人类. 本文主要参考了其官方文档. Requests具有完备的中英文文档, 能完全满 ...
- YUI Compressor 压缩 JavaScript 原理-《转载》
YUI Compressor 压缩 JavaScript 的内容包括: 移除注释 移除额外的空格 细微优化 标识符替换(Identifier Replacement) YUI Compressor包括 ...
- javaScript一些需要注意的细节
变量声明早于代码运行. 函数声明早于变量声明. this指针代表的是执行当前代码的对象的所有者. JavaScript执行完同步,才能执行异步队列.如:alert,for if while 同步执行, ...
- python图片处理和matlab图片处理的区别
作者:波布兰链接:https://www.zhihu.com/question/28218420/answer/39904627来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- HTML/CSS权值继承
<style type="text/css">p{color:red;}.first{color:green;}/*因为权值高显示为绿色*/ span{color:pi ...
- 16bit C & ASM 如何混合编译?
起源: 今天在看以前没看完的一本书<图形程序开发人员指南>,在做里面的例子. 第一章就出问题了,一个例子“L1_2.c, L1_3.asm" ,这是C程序和ASM汇编程序的混合编 ...
- lnmp 一键安装包
系统需求: CentOS/RHEL/Fedora/Debian/Ubuntu/Raspbian Linux系统 需要5GB以上硬盘剩余空间 需要128MB以上内存(如果为128MB的小内存VPS,Xe ...