Acwing 3619. 日期

96 阅读2分钟

3619. 日期 - AcWing题库

套用日期模板,进行变式,思想来源:AcWing 3619. 日期 - AcWing

思想:

求出 2012年1月1日到 2012年4月12日的天数day1,再求出2012年1月1日到到给定日期的天数day2;

day2-day1就是2012年4月12日到给定日期之间的天数,最后再对week进行一个映射,就可以求出这一天是星期几了。

Tips:

注意这里对于星期的预处理是:

"Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday","Monday","

而不是:

"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"

因为2012 年 4 月 12 日是星期四,其中,2012年1月1日到2012 年 4 月 12 日是104天,

假设题目输入的是4月13日,那么2012年1月1日到2012 年 4 月 13 日是105天。

week[105104]=week[1]week[105-104]=week[1],如果按照正常星期模拟的话,那么会输出 "Monday",但是题目告诉了我们  4 月 12 日是"Thursday",因此4 月 13 日肯定是"Friday"

code

#include<bits/stdc++.h>
using namespace std;
    const int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
string week[7]={"Thursday","Friday","Saturday","Sunday","Monday","Tuesday","Wednesday",};
    
    int is_leap(int y)
    {
        if(y%4==0&&y%100||y%400==0)return 1;
    return 0;
    }
    
    int get_day(int y,int m)
    {
        if(m==2)return 28+is_leap(y);
        return months[m];
    }
    
    int get_allday(int y,int m,int d)
    {
        int res=0;
        res+=is_leap(y);
        for(int i=0;i<m;i++) res+=get_day(y,i);
        
        return res+d;
    }
int main()
{
      int y=2012,m=0,d=0;
      cin>>m>>d;
      
      //求1.1到4.12的天数
     int day1=get_allday(2012,4,12);
     int day2=get_allday(y,m,d);
     
     //检验日期是否正确
     //cout<<day1<<" "<<day2<<endl;
     
     cout<<week[(day2-day1)%7]<<endl;
    return 0;
}

image.png