现在的位置: 首页 > 综合 > 正文

USACO section 1.1.3 黑色星期五

2018年04月29日 ⁄ 综合 ⁄ 共 1018字 ⁄ 字号 评论关闭

  黑色星期五~

题目大意:  从1900年1月1日开始,输入一个n,到1900+n-1年
    12月31日,统计这些天中的 13 号 分别落星期几。。

解决方案:
        (1)首先应该开一个长度至少为7的数组,来存放星期一到
    星期天。。
        

        (2)其次,就是有关闰年判别的算法,这个算法要当做一个模板
    记住,,,用的时候要 不加思考的立马秒出来啊,,,

 

bool inline is_leap( int year )
{
    if ( year%4 == 0&&year%100 != 0||year%400 == 0 )
    {
        return true;
    }
    else
    {
        return false;
    }
}

        (3)然后,就是对于怎样累加每次所得到的天数技巧。。。判断出1900年1月13日为星期6,I = 6;
        然后将每个月依次加到这个I上,在对I模7得到它是星期几,不满足1900+n-1这个条件为止

        (4)核心代码就是一个时间复杂度为O(n2)的for循环,外层for用来判断是否是闰年,是的话,更新mon[1]的值为29,

        每进行一次内循环都要维护下mon[1] 为28。。。

代码:

# include<iostream>
# include<cstdio>
# include<cmath>
# include<cstring>
# include<cstdlib>
# include<algorithm>

using namespace std;

int day[7];
int mon[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };

bool inline is_leap( int year )
{
    if ( year%4 == 0&&year%100 != 0||year%400 == 0 )
    {
        return true;
    }
    else
    {
        return false;
    }
}


int main(void)
{
    memset(day,0,sizeof(day));
    int n;
    cin>>n;
    n = n + 1900;
    int I = 6;//1900年1月13日 是 星期六
    for ( int i = 1900;i < n;i++ )
    {
        if ( is_leap( i ))
            mon[1] = 29;
        for ( int j = 0;j < 12;j++ )
        {
            day[I]++;
            I = I + mon[j];
            I = I % 7;
        }
        mon[1] = 28;
    }

    cout<<day[6];

    for ( int i = 0;i < 6;i++ )
    {
        cout<<' '<<day[i];
    }

    return 0;
}







抱歉!评论已关闭.