每日一博第一天!

保持你的决心

题目描述

13号又是星期五是一个不寻常的日子吗?

13号在星期五比在其他日少吗?为了回答这个问题,写一个程序来计算在n年里13

日落在星期一,星期二......星期日的次数.这个测试从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年是闰年.

    请不要预先算好数据!

输入

一个整数n.

输出

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

样例输入

20

样例输出

36 33 34 33 35 35 34

这题有坑!!!

  1. 1900年1月1日是星期一(不是六)
  2. 先输出星期六!!!
  3. 到1900+n-1年12月31日!!!

看完题目,感觉心中有千万只草泥马奔腾而过...

不是照样做对了吗

经过一番思考 乱搞 , 我想出了一种思路:

穷(bào)举(lì)大法好啊!!!

思路:

从当天起,一日一日判断日期,逢13累加。(简单粗暴)

Code:

#include<bits/stdc++.h>
using namespace std; const int yue[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int n=1900,nn,month=1,dayj=1,week=1,ryear;
int day[8]; bool pd(int x) //判断闰年
{
if((x % 100 == 0 && x % 400 == 0) || (x % 100 != 0 && x % 4 == 0))
return true;
return false;
} int main()
{
freopen("friday.in","r",stdin);
freopen("friday.out","w",stdout); cin>>nn;
while(1) //穷举
{
if(n == 1900+nn && month == 1 && dayj == 1)
{
break;
} ryear = pd(n) ? 1 : 0;
dayj++;
week++; if(dayj > yue[ryear][month]) //归1
{
dayj=1;
month++;
}
if(month > 12)
{
month=1;
n++;
}
if(week > 7)
{
week=1;
}
if(dayj == 13)
{
day[week]++;
}
} cout<<day[6]<<" "<<day[7]<<" "<<day[1]<<" "<<day[2]<<" "<<day[3]<<" "<<day[4]<<" "<<day[5]<<endl; //输出
return 0;
}

谁都别走,后面还有!

然鹅,这种方法太无脑了。

急需优化!

思路2:

一月一月地累加,并算出下个月的十三号是周几。

公式:闰年加上 day13=day13%7+1 ,然后(闰平年一样) day13=(day13+month[j]-1)%7+1。

Code2:

#include<bits/stdc++.h>
using namespace std; const int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int n,day13=6;
int day[8]; int main()
{
freopen("friday.in","r",stdin);
freopen("friday.out","w",stdout); cin>>n;
for(int i=1900;i<=1900+n-1;i++)
{
for(int j=1;j<=12;j++)
{
day[day13]++;
if(j == 2 && i % 4 == 0 && (i % 100 != 0 || i % 400 == 0)) //判断闰年
day13=day13%7+1; //公式
day13=(day13+month[j]-1)%7+1; //公式
}
} cout<<day[6]<<" "<<day[7]<<" "<<day[1]<<" "<<day[2]<<" "<<day[3]<<" "<<day[4]<<" "<<day[5]<<endl;
return 0;
}

我看谁敢走,还没完!

传说有一种推算星期几的公式,叫“蔡勒公式”!

蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。

1582年10月4日后:w = (d + 1+ 2m+3(m+1)/5+y+y/4-y/100+y/400)%7;

1582年10月4日前:w = (d+1+2m+3(m+1)/5+y+y/4+5) % 7;

w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六

c:世纪(注:一般情况下,在公式中取值为已经过的世纪数,也就是年份除以一百的结果,而非正在进行的世纪,也就是现在常用的年份除以一百加一;不过如果年份是公元前的年份且非整百数的话,c应该等于所在世纪的编号,如公元前253年,是公元前3世纪,c就等于-3)

y:年(一般情况下是后两位数,如果是公元前的年份且非整百数,y应该等于cMOD100+100)

m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)

d:日

[ ]代表取整,即只要整数部分。

不过,蔡勒公式只适合于1582年(中国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。

以上内容来自百度百科。

这么说,我们只需将Code2修改一点就可以了!

Code3:

#include<bits/stdc++.h>
using namespace std; int n;
int day[8];
int month[13][2]={{0, 0},{31, 31},{28, 29},{31, 31},{30, 30},{31, 31},{30, 30},{31, 31},{31, 31},{30, 30},{31, 31},{30, 30},{31, 31}}; bool pd(int x)
{
if((x % 100 == 0 && x % 400 == 0) || (x % 100 != 0 && x % 4 == 0))
return true;
return false;
} int main()
{
freopen("friday.in","r",stdin);
freopen("friday.out","w",stdout); cin>>n;
for(int i=0;i<n;i++)
{
int days=0,t=pd(1900+i),n=1900+i;
for(int j=1;j<=12;j++)
{
int d=days+13;
day[((n-1)+(n-1)/4-(n-1)/100+(n-1)/400+d)%7]++; //公式
days+=month[j][t];
}
}
cout<<day[6]<<" "<<day[0]<<" "<<day[1]<<" "<<day[2]<<" "<<day[3]<<" "<<day[4]<<" "<<day[5]<<endl;
return 0;
}

然后,就真的没有然后了。

难道没人注意month有三种写法?

JZOJ.1002【USACO题库】1.1.3 Friday the Thirteenth黑色星期五的更多相关文章

  1. 【USACO题库】1.3.4 Prime Cryptarithm牛式

    好久没有发题解了,今天发一个很久很久之前写过得题吧 题目其实莫名的难 但是理解后,原来就是一只纸老虎 题目加工中~~~~(缩短题目) 加工完成:已知数字1-9组成集合的一个子集,求满足题意乘法步骤的情 ...

  2. 北大POJ题库使用指南

    原文地址:北大POJ题库使用指南 北大ACM题分类主流算法: 1.搜索 //回溯 2.DP(动态规划)//记忆化搜索 3.贪心 4.图论 //最短路径.最小生成树.网络流 5.数论 //组合数学(排列 ...

  3. ACM在线题库

    现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO http://ace.delos.com/u ...

  4. 猿题库 iOS 客户端架构设计

    原文: http://mp.weixin.qq.com/s?__biz=MjM5NTIyNTUyMQ==&mid=444322139&idx=1&sn=c7bef4d439f4 ...

  5. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

  6. NOI题库 1768最大子矩阵 题解

    NOI题库 1768最大子矩阵  题解     总时间限制: 1000ms 内存限制: 65536kB   描述   已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...

  7. 猿题库 iOS 客户端架构设计-唐巧

    序 猿题库是一个拥有数千万用户的创业公司,从20013年题库项目起步到2015年,团队保持了极高的生产效率,使我们的产品完成了五个大版本和数十个小版本的高速迭代. 在如此快速的开发过程中,如何保证代码 ...

  8. NOI题库 09:图像旋转翻转变换

    NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...

  9. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

随机推荐

  1. redis快照关闭了导致不能持久化的问题

    在使用redis的时候我们经常会遇到这种bug:   Python与Redis交互时,设置数据出现下列报错信息:   MISCONF Redis is configured to save RDB s ...

  2. Kettle环境的安装

    Kettle是绿色免安装的,下载完解压之后找到Spoon.bat,直接执行就好 欢迎界面 Kettle主要分为转换和作业2类 新建一个转换demo 创建了一个转换demo后,由于是数据抽取,因此我们抽 ...

  3. Bootstrap视频教程

    一.全局CSS样式 0.课件 001.概览_栅格系统 2.排版和代码 3.表格和按钮 4.表单 5.图片 6.辅助类 7.响应式工具 二.组件 8.图标_下拉菜单_按钮组 9.输入框组 10.导航 1 ...

  4. ORA-00054: 资源正忙 --锁表的解决方法

    问题描述 ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效 发生异常 原因:其他Session已经对目标表做了操作,且未提交操作,导致锁表,新的Session无法 ...

  5. pytest+allure展示环境信息

    allure展示环境信息 要将信息添加到Environment小部件,只需在生成报告之前在目录中创建environment.properties(或environment.xml)文件allure-r ...

  6. vue指令实现拖动的高级写法

    不熟悉vue自定义指令看这里: https://cn.vuejs.org/v2/guide/custom-directive.html vue指令实现拖动方法很方便也挺简单,但是网上大部分的教程代码, ...

  7. unix进程通信方式总结(中)(转)

    在上一篇博客http://blog.csdn.net/caoyan_12727/article/details/52049417已经总结了<<uinx环境高级编程>>进程通信前 ...

  8. 【查看修复HDFS中丢失的块】org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP

    首先得好看有多少损坏的文件,其中需要使用Hadoop的fsck命令: 以下是官方解释 用法:  hadoop fsck  //路径 以上将会展示该路径下所有受损的文件 最后用-delete 可以清除掉 ...

  9. 数据库文件结构、sqlserver ON [PRIMARY]

    在sqlserver创建表的语句中,最后总来一句on[primary],这到底是什么意思? .联机丛书中CREATE TABLE的语法下似乎没有找到.最后终于发现,具体如下: 在CREATE TABL ...

  10. RocketMQ之四:RocketMq事务消息

    事务消息 通过消息的异步事务,可以保证本地事务和消息发送同时执行成功或失败,从而保证了数据的最终一致性. 发送端执行如下几步: 发送prepare消息,该消息对Consumer不可见 执行本地事务(如 ...