【ACM算法】-- 日期篇 - 日期差值问题

在这里插入图片描述
像这类日期类问题有个统一的解法,就是把原区间的问题统一到确定区间问题上去,即把问题统一到,两个输入日期对预定义日期的天数差的差值,预定义日期如:(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;
}

这是日期类问题的统一做法,或者说是统一思想

发布了83 篇原创文章 · 获赞 15 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_42127861/article/details/104258934