zoukankan      html  css  js  c++  java
  • Lucky and Good Months by Gregorian Calendar(poj 3393)

    大致题意:

    科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识。

     定义:

    Goog month : 该月第一个工作日为星期一的月份

    Luckly month: 该月最后一个工作日为星期五的月份

    问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)

    【开始年、月】~【结束年、月】

         在这个时间区间内,有多少个Goog month,有多少个Luckly month

    文章要点:

    Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC

    GC的起始日期为 1年1月1号,该日为星期六

    GC平年有365天,闰年366天(2月多1天)

    GC有12个月,各月的天数和现在的使用的西历一致

    GC在1582年之前(不包括1582),若该年份能被4整除,则为闰年

    GC在1582年之后(包括1582),判断闰年的标准(满足下面随便一个):

    (1) 能被4整除,但不能被100整除;

    (2) 能被400整除。

    由于历史原因,GC规定1700年无条件为闰年

    由于历史原因,GC规定1752年9月3日~13日共11天不存在,即1752年9月只有19天

    GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中Mon到Fri为工作日,Sun和Sat为休息日

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int mnum[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int rnum[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
    int nu52[13]={0,31,29,31,30,31,30,31,31,19,31,30,31};
    int rr[10010],rr_b[10010],good[10010][13],lucky[10010][13];
    int run(int x)
    {
        if(rr_b[x])return rr[x];
        rr_b[x]=1;
        if(x<1582&&x%4==0)rr[x]=1;
        else if(x==1700)rr[x]=1;
        else if(x%400==0)rr[x]=1;
        else if(x%4==0&&x%100!=0)rr[x]=1;
        return rr[x];
    }
    void work()
    {
        int day=5;
        for(int i=1;i<=10000;i++)//循环年份 
        {
            for(int j=1;j<=12;j++)//循环月份
            {
                if(j==1)//一月和普通月的差别 
                {
                    good[i][j]=good[i-1][12];
                    lucky[i][j]=lucky[i-1][12];
                }
                else
                {
                    lucky[i][j]=lucky[i][j-1];
                    good[i][j]=good[i][j-1];
                }
                if(i==1752)//1752年 
                {
                      int gd=(day+1)%7,ld=(day+nu52[j])%7;
                      if(gd==1||gd==6||gd==0)good[i][j]+=1;
                      if(ld==5||ld==6||ld==0)lucky[i][j]+=1;
                      day=(day+nu52[j])%7;
                }
                else if(run(i))//普通闰年 
                {
                    int gd=(day+1)%7,ld=(day+rnum[j])%7;
                      if(gd==1||gd==6||gd==0)good[i][j]+=1;
                      if(ld==5||ld==6||ld==0)lucky[i][j]+=1;
                      day=(day+rnum[j])%7;
                }
                else//普通年 
                {
                    int gd=(day+1)%7,ld=(day+mnum[j])%7;
                      if(gd==1||gd==6||gd==0)good[i][j]+=1;
                      if(ld==5||ld==6||ld==0)lucky[i][j]+=1;
                      day=(day+mnum[j])%7;
                }
            }
        }
    }
    int main()
    {
        int x,xm,y,ym,T;
        work();
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d%d%d",&x,&xm,&y,&ym);
            if(xm==1)printf("%d %d
    ",lucky[y][ym]-lucky[x-1][12],good[y][ym]-good[x-1][12]);
            else printf("%d %d
    ",lucky[y][ym]-lucky[x][xm-1],good[y][ym]-good[x][xm-1]);
        }//注意xm是一月份的时候 
        return 0;
    }
    View Code
  • 相关阅读:
    Django学习路31_使用 locals 简化 context 写法,点击班级显示该班学生信息
    Django学习路30_view中存在重复名时,取第一个满足条件的
    【Python】基本统计值计算

    [CTSC2016]萨菲克斯·阿瑞
    Linux与WIN 网络连接 winscp 的连接问题
    MFC 文件详解
    Hadoop入门学习随笔
    Scala入门学习随笔
    大数据用到的技术
  • 原文地址:https://www.cnblogs.com/harden/p/5645730.html
Copyright © 2011-2022 走看看