#373. 「USACO1.1」Friday the Thirteenth 题解

Posted ABBAawa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#373. 「USACO1.1」Friday the Thirteenth 题解相关的知识,希望对你有一定的参考价值。

#373. 「USACO1.1」Friday the Thirteenth 题解

题目传送门

题目知识点

模拟+数学

闰年知识点

题意说明

写一个程序来计算在n年里13日落在星期一,星期二......星期日的次数。这个测试从1900年1月1日到1900+n-1年12月31日.n是一个非负数且不大于400。请不要预先算好数据!
很明显,这道题会考察到和年份有关的知识点(已在知识点中列出,欢迎查阅),但是总结一下就是四年一闰,百年不闰,四百年又闰。(不会的话去问小学老师

代码+解释

#include<bits/stdc++.h>//伟大的万能头文件
using namespace std;
int a[13]=0,31,28,31,30,31,30,31,31,30,31,30,31,b[8];//a数组预处理每月天数,b数组用来存储答案
int main()

    int n,c=0;
    cin>>n;
    for(int i=1900;i<1900+n;i++)
    
        int f=0;//闰年标记
        if((i%4==0)&&(i%100)||(i%400==0))
			f=1;//判断是否为闰年,若成立则f赋值为真
        for(int j=1;j<=12;j++)
        
            int e=0;//如果为闰年,2月就要多一天,e在闰年情况下使2月的循环变量增大1
            if(f&&j==2)
				e=1;
            for(int k=1;k<=a[j]+e;k++)//k循环日期,m[j]即j月的天数
            
                c++;//st每天增加
                if(k==13) 
					b[c%7]++;
            
            //防抄袭
            if(e==1)
				e=0;//2月用过后要清零
        
    
    cout<<b[6]<<" "<<b[0]<<" "<<b[1]<<" "<<b[2]<<" "<<b[3]<<" "<<b[4]<<" "<<b[5];//输出顺序是Sat Sun Mon Tue Wed Thu Fri
    return 0;//华丽结束

欢迎大家指出错误

以上是关于#373. 「USACO1.1」Friday the Thirteenth 题解的主要内容,如果未能解决你的问题,请参考以下文章

P1202 [USACO1.1]黑色星期五Friday the Thirteenth

November 25th 2016 Week 48th Friday

November 11th 2016 Week 46th Friday

June 30th 2017 Week 26th Friday

July 14th 2017 Week 28th Friday

September 30th 2016 Week 40th Friday