Friday the Thirteenth 黑色星期五 USACO 模拟 超级简单做法

1003: 1.1.3 Friday the Thirteenth 黑色星期五

时间限制: 1 Sec  内存限制: 128 MB
提交: 8  解决: 8
[提交] [状态] [讨论版] [命题人:外部导入]

题目描述

1.1.3 Friday the Thirteenth 黑色星期五

(friday.pas/c/cpp)

   13号又是一个星期五。13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数。给出N年的一个周期,要求计算1900年1月1日至1900+N-1年12月31日中十三号落在周一到周日的次数,N为正整数且不大于400.

这里有一些你要知道的:

1、1900年1月1日是星期一.
2、4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.
3、年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年).
4、以上规则不适合于世纪年。可以被400整除的世纪年为闰年,否则为平年。所以,1700,1800,1900和2100年是平年,而2000年是闰年.

请不要调用现成的函数

请不要预先算好数据(就是叫不准打表)!

格式

PROGRAM NAME: friday

INPUT FORMAT:

(friday.in)

一个正整数n.

OUTPUT FORMAT:

(friday.out)

七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一...星期五的次数..

输入格式

20

输出格式

36 33 34 33 35 35 34

 

提示

 

来源/分类

这道题其实我也想了很久

首先思路1 一天一天枚举 不用说肯定超时

2 一月一月枚举 n<=400 12*400还行没问题!

那么我们就这么做啦

那么怎么处理每个月之间的转化呢

这里我想到了一个非常神奇的做法(看日历)

我把 平年 中相邻月份的13号是星期几找出来,假如1月13日是星期3,2月13日是星期6  就相差了3天 那么我建一个表(不算打表吧)

 between[1]=3代表1月和2月 的13号所在的星期几 的那个“几”相差多少 (有点绕O(∩_∩)O哈哈~)

那这样子肯定每一年都是相似的差值

只是在闰年的时候between[2]+1就变成了1即可

事实证明,我这个全网最神奇的做法是可行的!

太开心了想了半个小时

 

其实以后我还是要多善于思考一下

思考一下没准你就会雨过天晴 海阔天空!

 

 

神奇代码如下:O(∩_∩)O哈哈~

#include<bits/stdc++.h>
using namespace std;
int between[13]={0,3,0,3,2,3,2,3,3,2,3,2,3};//看日历打表  
int sum[8];
int judge(int year,int month){
    if(month!=2)
        return 0;
    if(year%4==0&&year%100!=0  || year%400==0)
        return 1;
    return 0;
}
int main()
{
    int n;
    cin>>n;
    int Day13inweek=6;
    for(int i=1900;i<1900+n;i++) 
        for(int j=1;j<=12;j++)//枚举月 
        {
            sum[Day13inweek]++;
            Day13inweek+=between[j];
            if(judge(i,j))
                Day13inweek++;
            if(Day13inweek>7)
                Day13inweek%=7;
        }
    cout<<sum[6]<<" "<<sum[7]<<" "<<sum[1]<<" "<<sum[2]<<" "<<sum[3]<<" "<<sum[4]<<" "<<sum[5];
    return 0;
}

 

猜你喜欢

转载自www.cnblogs.com/Tidoblogs/p/11270243.html