USACO section 1.1.3 黑色星期五

来源:互联网 发布:门禁一卡通软件设置 编辑:程序博客网 时间:2024/06/10 22:15
  黑色星期五~


题目大意:  从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;}



0 0
原创粉丝点击