Question

已知:母亲节在每年 5 月的第 2 个周日;父亲节在每年 6 月的第 3 个周日。
输入2000 年 1 月 1 日 到 2100 年 12 月 31 日间的合法日期,求最近的母亲节或父亲节在哪天?

Solution

打表
英语日期:除了11,12,13之外其他所有的以1,2,3结尾的尾缀为st nd rd。
闰年:

  • 普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年就是闰年);
  • 世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年);

估计很多人和我一样一开始没特判2100年吧。

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 5e5 + 5;

struct node{
    int y,m,d,sex;
}a[40000];

int f[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int tot=0;

void init(){
    int t=4;
    for(int i=2000;i<2100;i++){
        for(int j=1;j<=12;j++){
            int cnt=0;
            int kkk=0;
            bool ok1=false,ok2=false;
            for(int k=1;k<=f[j];k++){
                t=(t+1)%7;
                if(j==5&&t==6){
                    cnt++;
                }
                if(cnt==2&&!ok1) {ok1=true;a[++tot]={i,j,k,0};}
                if(j==6&&t==6){
                    kkk++;
                }
                if(kkk==3&&!ok2) {ok2=true;a[++tot]={i,j,k,1};}
            }
            if(j==2 && i%4==0){
                t=(t+1)%7;
            }
        }
    }
    a[++tot]={2100,5,9,0};
    a[++tot]={2100,6,20,1};
}

void print(int x){
    if(a[x].sex==1) cout<<"Father's Day: June ";
    else cout<<"Mother's Day: May ";
    int k=a[x].d;
    cout<<a[x].d;
    if(k==1||k==21||k==31) cout<<"st";
    else if(k==2||k==22) cout<<"nd";
    else if(k==3||k==23) cout<<"rd";
    else cout<<"th";
    cout<<", "<<a[x].y<<endl;
}

bool check(int x,int Y,int M,int D){
    int y=a[x].y;
    int m=a[x].m;
    int d=a[x].d;
    if(y>Y){
        return true;
    }
    else if(y==Y){
        if(m>M) return true;
        else if(m==M){
            if(d>D) return true;
            return false;
        }
        return false;
    }
    return false;
}

void solve(){
    int Y,M,D;cin>>Y>>M>>D;
    for(int i=1;i<=tot;i++){
        if(check(i,Y,M,D)){
            print(i);
            break;
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    init();
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}