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

    http://poj.org/problem?id=3393

    题意 : 对于这篇长长的英语阅读,表示无语无语再无语,花了好长时间,终于读完了。题目中规定每周的周六日为假日,其他为工作日,若是一个月的第一个工作日是周一,就定义这个月为good,若是一个周的最后一个工作日是周五,就定义这个月为luck。给你一个起始年月,一个终止年月,让你求出在这中间有多少luck月有多少good月。当然了,若是一整片文章就写了这点东西那也就太废话了,所以题目中还给出了几点应该注意的:

    1.在1582年以前,只要年份取余4为0就为闰年,在1582年以后,年份取余4为0且取余100不为0或者是取余400为0才是闰年。

    2.由于历史原因,1752年9月3日到9月13日是不存在的,也就是说1752年9月是少了11天的,只有19天。

    3.由于历史原因,1700年无条件为闰年。

    4.该历法从1年1月1日开始,这天为周六。

    5.该历法每周有7天,从周六开始为第一天。

    思路 :好麻烦的一道模拟题。。。。若是前一个月是luck,则下一个月必定为good,所以两个计数器可以同步,但是因为有边界问题,若是给出的起始月份是good,则前一个月份是不能够加进来的,而若是给定的终止月份是luck,那下一个月也不能加进来。为了算时好算,直接把从1年1月1日到起始日期的天数加了1,这也是为了防止出边界。所以,先算了起始月份是否是good,剩下的从起始月份开始,算的都是月份加1是不是good,luck。也就是说虽然写的是第 i 个月怎么样,但实际上,我们算的都是 i+1是不是good luck。算1年1月1日时,总的天数初始化为了1,使得直接加到了起始年份月份的第一天了,所以你每加一个月的天数,就直接加到了下一个月的第一天了,所以判断的就是下一个月的。

    #include <iostream>
    using namespace std ;
    int mon[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31} ;
    int leapmon[13] = {0,31,29,31,30,31,30,31,31,30,31,30,31} ;
    bool leap(int n)
    {
        if(n < 1582)
        {
            if(n % 4 == 0)
            return true ;
            return false ;
        }
        else
        {
            if((n%4 == 0&&n%100!=0)||(n%400 == 0)||n==1700)
            return true;
            return false ;
        }
    }
    int sum(int startyear,int startmonth)
    {
        int day = 1 ;
        for(int i = 1 ; i < startyear ; i++)
        {
            if(leap(i))
            day += 366 ;
            else day += 365 ;
        }
        for(int i = 1 ; i < startmonth ; i++)
        if(leap(startyear))
        day += leapmon[i] ;
        else day += mon[i] ;
        if(startyear > 1752||(startyear == 1752&&startmonth > 9))
        day -= 11 ;
        return day ;
    }
    int main()
    {
        int t ;
        cin>>t ;
        while(t--)
        {
            int startyear ,startmon ,endyear,endmon ;
            cin>>startyear>>startmon>>endyear>>endmon ;
            int day = sum(startyear,startmon) ;
            int good = 0 ,luck = 0 ;
            if(((day+5)%7 == 1) || ((day+5)%7 == 6)||((day+5)%7 == 0))
            good++ ;
            int j ;
            for(int i = startyear ; i < endyear ; i++)
            {
                i == startyear ? j = startmon : j = 1 ;
                for(  ; j <= 12 ; j++)
                {
                    if(leap(i))
                    day += leapmon[j] ;
                    else day += mon[j] ;
                    if(i == 1752&&j == 9)
                    day -= 11 ;
                    if(((day+5)%7 == 1) || ((day+5)%7 == 6)||((day+5)%7 == 0))
                    {good++ ;luck++ ;}
                }
            }
            startyear == endyear ? j = startmon : j = 1 ;
            for( ; j <= endmon ; j++)
            {
                if(leap(endyear))
                day += leapmon[j] ;
                else day += mon[j] ;
                if(endyear == 1752 && j == 9)
                day -= 11 ;
                if(((day+5)%7 == 1) || ((day+5)%7 == 6)||((day+5)%7 == 0))
                {
                   if(j != endmon)
                   good++ ;
                   luck++ ;
                }
            }
            cout<<luck<<" "<<good<<endl  ;
        }
    return 0 ;
    }
    View Code
  • 相关阅读:
    The Brain vs Deep Learning Part I: Computational Complexity — Or Why the Singularity Is Nowhere Near
    unity3d NGUI多场景共用界面制作
    python第三方库系列之十九--python測试使用的mock库
    oracle之单行函数
    Andropid自己定义组件-坐标具体解释
    [WebGL入门]二,開始WebGL之前,先了解一下canvas
    【BZOJ2318】【spoj4060】game with probability Problem 概率DP
    苹果改版之后,关于隐私协议加入的问题解决方式
    Binary Tree Level Order Traversal II
    首届中国智慧城市协同创新峰会将于6月20日在大连隆重举行
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3450325.html
Copyright © 2011-2022 走看看