zoukankan      html  css  js  c++  java
  • 三部曲二(基本算法、动态规划、搜索)-1003-Lucky and Good Months by Gregorian Calendar

    模拟加阅读题。。。。。。虽然很多事常识性的知识,但也有许多不知道的知识,关键是不读不知道那些是已经知道的那些不是,许多重要的信息零散的分布在一大坨英文里,读起来很痛苦。。。。。。自己读了一遍,读的晕晕乎乎的,还是看了别人的题解。

    别人博客给的题意要点:

    文章要点:

    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为休息日

    我自己的解题思路:

    这道题是一道模拟题,不难想,不过需要细心,一点不对就会WA。

    先算每年第一天是从1年1月1日后的第几天,再算具体到某年某月的第一天是从1年1月1日后的第几天,若是第n天,如果n%7<=2的话,就说明是Good Month,如果这一月是Good Month,上一月一定是 Lucky Month。

    #include <iostream>
    #include <cstring>
    #include <stdio.h>
    #define maxn 10001
    
    using namespace std;
    
    int ys,ms,ye,me,days[maxn],bgday[maxn];
    int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    bool IsLeapYear(int year)
    {
        if(year==1700)
            return true;
        else if(year<1582)
        {
            if(year%4==0)
                return true;
            else
                return false;
        }
        else if(year>=1582)
        {
            if((year%100!=0&&year%4==0)||year%400==0)
            {
                return true;
            }
            else
                return false;
        }
    }
    
    void CountDays()
    {
        int i;
        for(i=1;i<10001;i++)
        {
            if(IsLeapYear(i))
            {
                days[i]=366;
            }
            else
                days[i]=365;
            if(i==1752)
                days[i]-=11;
            bgday[i+1]=bgday[i]+days[i];
        }
    }
    int main()
    {
    ////    freopen("in.txt","r",stdin);
        bgday[1]=0;
        CountDays();
        int i,j;
    ////    for(i=1;i<100;i++)
    ////    {
    ////        cout<<days[i]<<'	'<<bgday[i]<<'	';
    ////        if(i%5==0)
    ////            cout<<endl;
    ////    }
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int lm=0,gm=0;
            scanf("%d%d%d%d",&ys,&ms,&ye,&me);
    
            int td=bgday[ys];
            for(i=1;i<ms;i++)
            {
                td+=months[i];
                if(i==2&&IsLeapYear(ys))
                    td++;
                if(i==9&&ys==1752)
                    td-=11;
            }
            i=ys;
            j=ms;
            me++;
            if(me>12)
            {
                ye++;
                me=1;
            }
            while(!(i==ye&&j==me))
            {
    //            cout<<td<<' '<<td%7<<endl;
    //            cout<<td<<endl;
                if(td%7<=2)
                {
                    gm++;
                    if(!(i==ys&&j==ms))
                        lm++;
                }
                td+=months[j];
                if(j==2&&IsLeapYear(i))
                    td++;
                if(i==1752&&j==9)
                    td-=11;
                j++;
                if(j>12)
                {
                    i++;
                    j=1;
                }
            }
            if(j==2&&IsLeapYear(i))
                td++;
            if(i==1752&&j==9)
                td-=11;
    //            cout<<td<<endl;
            if(td%7<=2)
                lm++;
            printf("%d %d
    ",lm,gm);
        }
        return 0;
    }
    

      

  • 相关阅读:
    计算机安装Fedora操作系统——Win10+Linux双系统
    性能测试——压力测试指标
    系统吞吐量(TPS)、用户并发量、性能测试概念和公式
    在 数学吧 看到一个 极限题
    东方学帝 和 K歌之王 的 科学观 和 科学方法 的 对比
    走一走 欧拉先生 走过 的 路
    推导一个 经典物理 里 的 黑洞 的 坍缩半径
    四色定理 太简单了 , 来 玩 n 维空间 里 的 x 色定理
    今天看到了一个 求 平面图形 Centroid 的 办法
    记录一下这几天的一些讨论
  • 原文地址:https://www.cnblogs.com/aljxy/p/3465422.html
Copyright © 2011-2022 走看看