洛谷月赛最后的狂欢 2038年问题

链接

题目描述
网络时代,机会与危机共存。“千年虫”解决之后,会不会有新的“虫”出现?回答是肯定的,“2038年”就是一个新的关卡。
也许大家都已经知道计算机的2000年问题是什么概念,但是什么时候又冒出来一个2038年问题的呢?
用C语言编制的程序不会碰到2000年问题,但是会有2038年问题。这是因为,大多数C语言程序都使用到一个叫做“标准时间库”的程序库,这个时间库用一个标准的4字节也就是32位的形式来储存时间信息。
当初设计的时候,这个4字节的时间格式把1970年1月1日凌晨0时0分0秒作为时间起点,这时的时间值为0。以后所有的时间都是从这个时间开始一秒一秒累积得来的。
比方说如果时间已经累积到了919642718这个数值,就是说这时距离1970年1月1日凌晨0时0分0已经过去了919642718秒,换算一下就应该是1999年2月21日星期天16时18分38秒。
这样计算时间的好处在于,把任意两个时间值相减之后,就可以很迅速地得到这两个时间之间相差的秒数,然后你可以利用别的程序把它换算成明白易懂的年月日时分秒的形式。
一个4字节也就是32位的存储空间的最大值是2147483647,请注意!2038年问题的关键也就在这里———当时间一秒一秒地跳完2147483647那惊心动魄的最后一秒后,它就会转为负数也就是说时间无效。那一刻的准确的时间为2038年1月19日星期二晚上03:14:07,之后所有用到这种“标准时间库”的C语言程序都会碰到时间计算上的麻烦。
你要解决的问题是,现有一台计算机,表示时间的变量长度为N位。给定一个“时间起点”,求出对于这个“时间起点”时间,最后的有效时间是什么时候。
输入输出格式
输入格式:
第一行为数据组数T
第2……T+1行,每行7个数字描述一组数据,分别为表示时间的变量长度(二进制位数),然后是“时间起点”的年份,月份,日期,小时,分钟,秒数。

输出格式:
T行,对于每组数据,输出1行,6个数字,分别表示最后的有效时间的年份,月份,日期,小时,分钟,秒数。

输入输出样例
输入样例#1:
1
16 2000 1 1 0 0 0
输出样例#1:
2000 1 1 9 6 7
输入样例#2:
2
32 1970 1 1 0 0 0
32 2015 11 8 8 30 0
输出样例#2:
2038 1 19 3 14 7
2083 11 26 11 44 7
说明
对于50%的数据 变量的位数<=16;
对于所有数据,变量长度<=32,数据组数<=1000,0<=年份<=10000

这道题其实就是很水的模拟。。。首先根据秒来进行模拟一定会超时。我们来想一下优化。首先我们可以预处理下最后的秒、分钟、小时,因为一年多少天一个月多少天对这些是没有影响的。然后我们就把原来的2^31-1优化成了24855(小数忽略不计)。完全可以模拟每天来得到答案。。但是我不知道为什么WA一部分点。。。大概可能是因为3200没有算成平年还有1583年消失的10天算上了吧(纯属吐槽。。)

代码不贴了。easy。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值