像这类日期类问题有个统一的解法,就是把原区间的问题统一到确定区间问题上去,即把问题统一到,两个输入日期对预定义日期的天数差的差值,预定义日期如:(0000年1月1日),这样如题所示,样例题目即转为2011.04.12-0000.01.01之间的天数差与2011.04.22-0000.01.01之间的天数差的差值,这样做有一个巨大的好处,就是预处理,当从oj上读入数据开始,可以再O(1)的时间内将结果算出来,而不是等读入数据才开始运算,这样就达到了一种以空间换时间的思想
代码:
#include<bits/stdc++.h>
using namespace std;
#define ISYEAR(x) x%100!=0&&x%4==0||x%400==0?1:0
//定义宏判断是否是闰年,方便计算每月天数
int dayOfMonth[13][2]={
0,0,
31,31,
28,29,
31,31,
30,30,
31,31,
30,30,
31,31,
31,31,
30,30,
31,31,
30,30,
31,31
};//预存每月天数,注意二月配合宏定义做特殊处理
struct Date{
int Day;
int Month;
int Year;
void nextDay(){
Day++;
if(Day>dayOfMonth[Month][ISYEAR(Year)]){
Day=1;
Month++;
if(Month>12){
Month=1;
Year++;
}
}
}
};
int buf[5001][13][32];
int Abs(int x){
return x<0?-x:x;
}
int main(){
Date tmp;
int cnt=0;
tmp.Day=1;
tmp.Month=1;
tmp.Year=0;
while(tmp.Year!=5001){
buf[tmp.Year][tmp.Month][tmp.Day]=cnt;//记录对应的tmp日期距离0年1月1日的距离
tmp.nextDay();
cnt++;
}
int d1,m1,y1;
int d2,m2,y2;
while(scanf("%4d%2d%2d",&y1,&m1,&d1)!=EOF){
scanf("%4d%2d%2d",&y2,&m2,&d2);
printf("%d\n",Abs(buf[y2][m2][d2]-buf[y1][m1][d1])+1);
}
return 0;
}
这是日期类问题的统一做法,或者说是统一思想